He estado tratando de fusionar dos imágenes usando gd lib. Una tarjeta (fondo) y un marco "nuevo" para esa tarjeta (primer plano, con el centro transparente).
Este es mi código:
<?php $card = imagecreatefrompng('img/folder1/card.png'); $frame = imagecreatefrompng('img/folder2/frame.png'); list($width,$height) = getimagesize($frame); imagealphablending($card, true); imagesavealpha($card, true); imagecopy($card, $frame, 0, 0, 0, 0, $width, $height, 100); header('Content-Type: image/png'); imagepng($card);Obtengo una salida, pero es solo la tarjeta sin el marco.
Saludos cordiales, ZF
Editar (12 horas después): descubrí por qué mi salida es solo la tarjeta (fondo), independientemente de mis cambios.
Eliminé el último valor 100 después de $height :
imagecopy($card, $frame, 0, 0, 0, 0, $width, $height);Ahora mi salida es solo frame.png . No importa si uso ImageAlphaBlending .
Pero sé que card.png definitivamente está debajo de frame.png , porque moví el frame.png hacia un lado en un eje, y card.png se vuelve visible. Por lo tanto, falla al fusionar las imágenes, respetando la transparencia de frame.png
Si guardo la salida en un archivo, es un .png transparente aunque.
¿Es imagecopy incluso adecuada para fusionar frame.png con un centro transparente en un fondo ( card.png )?
Editar: ¡Perdón por el desorden! Estaba trabajando con dos versiones al mismo tiempo. Ahora he limpiado mi espacio de trabajo actual y he escrito una nueva versión desde cero.
Eliminé el 100 después de $height en la versión que publiqué aquí:
imagecopy($card, $frame, 0, 0, 0, 0, $width, $height);Aclaración de la edición anterior: Nada cambió en absoluto. La salida seguía siendo solo card.png .
PERO el código de mi nueva versión es ( Final & Working ):
<?php $card = imagecreatefrompng('img/folder1/card.png'); $frame = imagecreatefrompng('img/folder2/frame.png'); $width = "402"; $height = "599"; imagealphablending($card, true); imagesavealpha($card, true); imagecopy($card, $frame, 0, 0, 0, 0, $width, $height); header('Content-Type: image/png'); imagepng($card); imagedestroy($card); imagedestroy($frame);Como puede notar, codifiqué el ancho y la altura de la imagen. En lugar de usar getimagesize
list($width,$height) = getimagesize($frame);Verifiqué la salida de $width , $height antes y son correctos, pero ese parecía ser mi problema. Si alguien tiene una respuesta a eso, ¡no dude en explicarla!
Abandoné el proyecto durante bastante tiempo. Como sugirió Maik , podría haber sido un problema de formato .png.
Qué decir... el consejo, y por tanto el conocimiento, viene con el tiempo:
De hecho, el error no fue producido por getimagesize y no es necesario codificar el tamaño de la imagen.
Era un problema de formato de imagen simple.
La "Nueva Versión" mencionada que escribí desde cero simplemente usó diferentes imágenes .png con el formato correcto.
Simplemente no sabía esto en ese momento, porque aparentemente obtuve la misma imagen del creador, pero han sido diferentes representaciones y, por lo tanto, diferentes tipos de formato.
Vota a favor de Maik y verifica tu tipo de formato .png (tipo 3).
Editar: Ah, y tal vez eche un vistazo a imagick;)