2008-11-23 20 views
43

Oye, tengo problemas para tratar de mantener la transparencia en un PNG cuando creo una miniatura, cualquier experiencia con esto? cualquier ayuda sería grande, esto es lo que estoy haciendo actualmente:PNG Transparencia con PHP

$fileName= "../js/ajaxupload/tees/".$fileName; 

list($width, $height) = getimagesize($fileName); 

$newwidth = 257; 
$newheight = 197; 

$thumb = imagecreatetruecolor($newwidth, $newheight); 
imagealphablending($thumb, true); 
$source = imagecreatefrompng($fileName); 
imagealphablending($source, true); 

imagecopyresized($thumb, $source, 0, 0, 0, 0, $newwidth, $newheight, $width, $height); 

imagesavealpha($thumb, true); 
imagepng($thumb,$newFilename); 

Respuesta

81

he tenido éxito haciéndolo así en el pasado:

$thumb = imagecreatetruecolor($newwidth, $newheight); 
imagealphablending($thumb, false); 
imagesavealpha($thumb, true); 

$source = imagecreatefrompng($fileName); 
imagealphablending($source, true); 

imagecopyresampled($thumb, $source, 0, 0, 0, 0, $newwidth, $newheight, $width, $height); 

imagepng($thumb,$newFilename); 

Me pareció que la calidad de imagen de salida mucho mejor usando imagecopyresampled() que imagecopyresized()

+0

que lo rompió! ¡Muy agradecido! – BastardPrince

+1

Esto no funciona para mí :( – 2by

+0

+1 gracias, funcionó para mí –

1

Ver dycey's answer to "How do I resize...". Esencialmente, debe llenar todo el fondo con transparencia antes de realizar cualquier otra operación.

+0

Esa pregunta está todavía sin respuesta. Sin embargo, tal vez los dos necesitan fusionarse. – strager

2

imagecopyresized no es compatible con la transparencia correctamente.

imagecopymerge lo hace, pero no cambia el tamaño.

¿La solución? Probablemente terminarás cambiando el tamaño de la cosa manualmente.

2

Esas funciones de acceso a la biblioteca GDlib subyacente, que es una juguete fino, pero no es algo que produce buenos resultados. Si tiene la opción, use imagemagick en su lugar. La desventaja es que actualmente no hay buenas conexiones de php, por lo que debe acceder a ella a través del intérprete de comandos, que normalmente no está permitido en los hosts compartidos.

13

Olvide el índice de transparencia de color, nunca funciona en todos los productos de representación. En lugar de utilizar una máscara de capa alfa:

$image = imagecreatetruecolor($size, $size); 

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

$trans_layer_overlay = imagecolorallocatealpha($image, 220, 220, 220, 127); 
imagefill($image, 0, 0, $trans_layer_overlay); 
+0

¡Impresionante! ¡Perdió más de una hora para resolver esto y su solución es la única que funcionó! –

+0

Perfecto como siempre. Usted es un gran hombre @ user629089. Muchas gracias. – rasputin

+3

¿Puede explicar por qué utilizó '220, 220, 220 ¿? –

Cuestiones relacionadas