PHP / GD imagesavealpha e imagealphablending
-
06-07-2019 - |
Pergunta
Eu estou usando GD para redimensionar e imagens converter-se, no entanto, durante meus testes eu encontrei um comportamento estranho ao converter PNG transparente do que JPEG. De acordo com a imagealphablending () é ativado por padrão, mas a fim de preservar a transparência que deve definir imagesavealpha () para true (que por sua vez exige que eu definir imagealphablending () para false). Assim, a maneira correta deve ser:
$result = ImageCreateFromPNG(...);
ImageAlphaBlending($result, false);
ImageSaveAlpha($result, true);
ImageFill($result, 0, 0, IMG_COLOR_TRANSPARENT);
ImageJPEG($result);
ImageDestroy($result);
No entanto, se eu fizer isso da maneira "correta" toda a área de transparência surge negro no JPEG. Isso parece funcionar (JPEG com fundo branco em áreas transparentes) em meus testes:
$result = ImageCreateFromPNG(...);
ImageAlphaBlending($result, true); // true by default, but still...
ImageSaveAlpha($result, true);
ImageFill($result, 0, 0, IMG_COLOR_TRANSPARENT);
ImageJPEG($result);
ImageDestroy($result);
Pode alguém por favor me esclareça sobre este assunto?
Solução
Provavelmente depende do seu PNG. Um arquivo PNG pode conter uma cor de fundo, que pode ser usado quando a transparência não funciona. Seu PNG, provavelmente, tem um fundo branco. Quando você define imageaplhablending a verdade ele pega a cor de fundo do seu PNG e usos que ao escrever o JPEG. Quando você configurá-lo para false ele pega o padrão para GD que é negro.
Você pode experimentar por si próprio. Criar um PNG transparente e guardá-lo com uma laranja ou rosa cor de fundo. Seu segundo exemplo deve mostrar que a cor.
A propósito, o truque cor de fundo PNG é uma agradável para imagens IE6. O IE6 não suporta PNGs transparentes para que ele irá exibi-los com qualquer cor de fundo que você salvou com. Ao salvar PNGs transparentes, salvá-los com a mesma cor de fundo como o seu site. Ele vai olhar melhor do que caixas brancas ou pretas em torno de suas imagens PNG no IE6.
Outras dicas
Se você estiver convertendo a partir de PNG (ou GIF) para JPG, você provavelmente deve copiar a imagem final para outra imagem que é preenchido com branco, usando imagecopy ($image
é qualquer imagem já criada com 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 ajude.