Pregunta PHP - Watermark PNG Transparency / Alpha


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

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 pregunta SO y una de las respuestas indica que no será transparente si no agrega estas dos líneas:

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

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


5
2017-07-27 02:39


origen


Respuestas:


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 con 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 relevante sobre los tipos de PNG de este blog:

La imagen de marca de agua debe estar en uno de los 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 correctamente el PNG-24   imagenes; por lo tanto no es recomendable.

Si está utilizando Adobe Photoshop para crear imágenes de marca de agua, es   Se recomienda usar el comando "Guardar para Web" con el siguiente   configuraciones:

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 otros beneficios, 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 lectura (este comentario en el mismo artículo), descubrí que PUEDE usar marcas de agua 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 este:

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

Utilizando imagecopymerge con las marcas de agua PNG-8 es bastante bueno para las marcas de agua "sobre la marcha", ya que el archivo de marca de agua es pequeño. Si realiza marcas de agua "detrás de escena", no importa el tamaño del archivo y puede obtener una calidad mucho mejor de la marca de agua PNG-24, usando imagecopy.

Espero que esto ayude a las confundidas marcas de agua que hay.


14
2017-07-27 03:30