Pergunta

Hey tendo alguns problemas tentando manter a transparência em um png quando eu criar uma miniatura dele, ninguém alguma experiência com isso? qualquer ajuda seria ótimo, aqui está o que eu estou fazendo atualmente:

$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);
Foi útil?

Solução

Eu tive sucesso fazendo isso como esta no passado:

$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);

Eu achei a qualidade da imagem de saída muito melhor usando imagecopyresampled() que imagecopyresized()

Outras dicas

Esqueça o índice de transparência de cor, isso nunca funciona em todos os produtos de renderização. Em vez disso use uma máscara de camada alpha:

$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);

imagecopyresized não suporta transparência corretamente.

imagecopymerge faz, mas não redimensionar.

A solução? Você provavelmente iria acabar redimensionando a coisa manualmente.

Essas funções acessar a biblioteca subjacente GDlib, que é um brinquedo bem, mas não é algo que faz para resultados agradáveis. Se você tem a opção, use imagemagick . A desvantagem é que não existem actualmente boas php ligações, então você precisa para acessá-lo sobre o shell, o que você normalmente não é permitido em hosts compartilhados.

Veja a resposta para "Como faço para redimensionar ... ". Essencialmente, você precisa preencher o fundo inteiro com transparência antes de fazer qualquer outra operação.

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