Pregunta

Estoy usando GD para cambiar el tamaño y convertir imágenes, sin embargo, durante mis pruebas encontré un comportamiento extraño al convertir PNG transparentes a JPEG. De acuerdo con el manual, ImageAlphaBlending () está activado de forma predeterminada, pero para preservar la transparencia debo establecer ImageSaveAlpha () a verdadero (que a su vez requiere que establezca ImageAlphaBlending () en falso). Entonces, la forma correcta debería ser:

$result = ImageCreateFromPNG(...);
ImageAlphaBlending($result, false);
ImageSaveAlpha($result, true);
ImageFill($result, 0, 0, IMG_COLOR_TRANSPARENT);
ImageJPEG($result);
ImageDestroy($result);

Sin embargo, si lo hago, "correcto" forma en que todo el área de transparencia aparece en negro en el JPEG. Esto parece funcionar (JPEG con fondo blanco en áreas transparentes) en mis pruebas:

$result = ImageCreateFromPNG(...);
ImageAlphaBlending($result, true); // true by default, but still...
ImageSaveAlpha($result, true);
ImageFill($result, 0, 0, IMG_COLOR_TRANSPARENT);
ImageJPEG($result);
ImageDestroy($result);

¿Puede alguien aclararme sobre este tema?

¿Fue útil?

Solución

Probablemente depende de tu PNG. Un archivo PNG puede contener un color de fondo, que puede usarse cuando la transparencia no funciona. Su PNG probablemente tiene un fondo blanco. Cuando establece imageaplhablending en true, recoge el color de fondo de su PNG y lo usa al escribir el JPEG. Cuando lo configura en falso, selecciona el valor predeterminado para GD que es negro.

Puedes probarlo por ti mismo. Cree un PNG transparente y guárdelo con un color de fondo naranja o rosa. Su segundo ejemplo debería mostrar ese color.

Por cierto, el truco de color de fondo PNG es bueno para las imágenes de IE6. IE6 no admite PNG transparentes, por lo que los mostrará con el color de fondo con el que los guardó. Al guardar PNG transparentes, guárdelos con el mismo color de fondo que su sitio web. Se verá mejor que los cuadros blancos o negros alrededor de sus imágenes PNG en IE6.

Otros consejos

Si está convirtiendo de PNG (o GIF) a JPG, probablemente debería copiar la imagen final a otra imagen que esté llena de blanco, usando imagecopy ( $ image es cualquier imagen ya creada con GD):

// Create a new background
$bg = imagecreatetruecolor(imagesx($image), imagesy($image));

// Allocate the color
$color = imagecolorallocate($bg, 255, 255, 255);

// Fill the background with white
imagefill($bg, 0, 0, $color);

// Alpha blending must be enabled on the background!
imagealphablending($bg, TRUE);

// Copy the current image onto the opaque background
if (imagecopy($bg, $image, 0, 0, 0, 0, imagesx($image), imagesy($image)))
{
    // Replace the image with the background copy
    imagedestroy($image);
    $image = $bg;
}

Espero que eso ayude.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top