2012-07-27 15 views
5

Sé que esto ha sido cubierto MUCHAS veces, pero sigo intentando diferentes scripts y modificando el que tengo, y I todavía no puedo obtener mi marca de agua PNG-24. transparente en la parte superior de mi imagen principal.PHP - Watermark PNG Transparency/Alpha

Esto es lo que tengo actualmente:

<? 

header('content-type: image/jpeg'); 

$watermark = imagecreatefrompng('watermark.png'); 
$watermark_width = imagesx($watermark); 
$watermark_height = imagesy($watermark); 

$image = imagecreatefromjpeg($imageURL); 
$image = imagecreatetruecolor($watermark_width, $watermark_height); 
$size = getimagesize($imageURL); 

imagealphablending($image, false); 
imagesavealpha($image, true); 

$dest_x = $size[0] - $watermark_width - 5; 
$dest_y = $size[1] - $watermark_height - 5; 

imagecopymerge($image, $watermark, $dest_x, $dest_y, 0, 0, $watermark_width, $watermark_height, 100); 

imagejpeg($image); 

imagedestroy($image); 
imagedestroy($watermark); 

?> 

acabo de leer otra cuestión de forma y una de las respuestas aconsejado que no va a ser transparente si no agrega estas dos líneas:

imagealphablending($image, false); 
imagesavealpha($image, true); 

Los agregué y todavía no. Intenté configurar los encabezados y la salida a PNG, pero todavía no tuve suerte. Cargué la marca de agua en mi navegador (en bruto) y definitivamente es transparente, pero no en la imagen. Sin duda, esto no puede ser tan difícil? ¿Alguna idea de lo que estoy haciendo mal?

Respuesta

14

No es un problema con el código de la aplicación, es con la imagen de marca de agua (PNG) en sí.

Muchos ejemplos/tutoriales de marcas de agua dicen usar una marca de agua PNG-24, pero según un blog que acabo de leer, dicen que imagecopymerge no trata muy bien los archivos PNG-24, por lo tanto, use PNG -8 y algunas configuraciones especiales de 'Guardar para Web'. Hice esto y funciona bien ahora.

Aquí está la sección pertinente acerca de los tipos PNG de this blog:

La imagen de marca de agua debe estar en una de las siguientes recomendados formatos:

  • PNG-8 (recomendado)
    Colores : 256 o menos
    Transparencia: On/Off
  • GIF Colores: 256 o menos
    Transparencia: On/Off
  • JPEG
    Colores: Color Verdadero
    Transparencia: n/a

La función imagecopymerge no maneja adecuadamente el PNG-24 imágenes; por lo tanto, no es recomendable.

Si está usando Adobe Photoshop para crear imágenes de marca de agua, es recomienda el uso de "Guardar para Web" comando con los ajustes siguientes:

File Format: PNG-8, non-interlaced 
Color Reduction: Selective, 256 colors 
Dithering: Diffusion, 88% 
Transparency: On, Matte: None 
Transparency Dither: Diffusion Transparency Dither, 100% 

Y para beneficios de otros , este es el código de marca de agua que tengo que funciona:

<? 
$masterURL = 'mydomain.com/myImage.jpg'; 

header('content-type: image/jpeg'); 
$watermark = imagecreatefrompng('watermark.png'); 
$watermark_width = imagesx($watermark); 
$watermark_height = imagesy($watermark); 
$image = imagecreatetruecolor($watermark_width, $watermark_height); 
$image = imagecreatefromjpeg($masterURL); 
$size = getimagesize($masterURL); 
$dest_x = $size[0] - $watermark_width - 5; 
$dest_y = $size[1] - $watermark_height - 5; 
imagecopymerge($image, $watermark, $dest_x, $dest_y, 0, 0, $watermark_width, $watermark_height, 100); 
imagejpeg($image); 
imagedestroy($image); 
imagedestroy($watermark); 
?> 

Después de un poco más de tiempo ading (this comment en el mismo artículo), descubrí que PUEDE usar filigranas PNG-24 pero con imagecopy en lugar de imagecopymerge.Puede reemplazar esta línea:

imagecopymerge($image, $watermark, $dest_x, $dest_y, 0, 0, $watermark_width, $watermark_height, 100); 

con éste:

imagecopy($image, $watermark, $dest_x, $dest_y, 0, 0, $watermark_width, $watermark_height); 

Usando imagecopymerge con PNG-8 marcas de agua es bastante bueno para 'sobre la marcha' marcas de agua, como el archivo de marca de agua es muy pequeña . Si realiza una marca de agua 'entre bastidores', en realidad no importa el tamaño del archivo y puede obtener una mejor calidad a partir de la marca de agua PNG-24, utilizando imagecopy.

Espero que esto ayude a las marcas de agua confundidas por ahí.

+1

No incluya capturas de pantalla de texto. – meagar

+2

@meagar: ¿Por qué? ¡Si te molesta tanto, reescríbelo! – TheCarver

+5

Lo hice, pero no debería haber tenido que hacerlo. No texto de captura de pantalla. Es malo para la web, malo para el sitio y malo para sus usuarios. – meagar