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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top