O seguinte snippet de código PHP usa GD para redimensionar um PNG carregado pelo navegador para 128x128. Funciona muito bem, exceto que as áreas transparentes na imagem original estão sendo substituídas por uma cor sólida - preto no meu caso.
Mesmo que imagesavealpha
esteja definido, algo não está certo.
Qual é a melhor maneira de preservar a transparência na imagem reamostrada?
$uploadTempFile = $myField[ 'tmp_name' ]
list( $uploadWidth, $uploadHeight, $uploadType )
= getimagesize( $uploadTempFile );
$srcImage = imagecreatefrompng( $uploadTempFile );
imagesavealpha( $targetImage, true );
$targetImage = imagecreatetruecolor( 128, 128 );
imagecopyresampled( $targetImage, $srcImage,
0, 0,
0, 0,
128, 128,
$uploadWidth, $uploadHeight );
imagepng( $targetImage, 'out.png', 9 );
alphablending = false
importante aqui? O doc afirma que ... "Você tem que desmarcar alphablending (imagealphablending($im, false)
), para usá-lo."imagecreatefrompng()
sugere queimagealphablending
deve ser definidotrue
, o que está claramente errado. Muito obrigado.Por que você torna as coisas tão complicadas? o seguinte é o que eu uso e até agora fez o trabalho para mim.
fonte
Eu acredito que isso deve resolver o problema:
editar: Alguém nas afirmações de documentos PHP
imagealphablending
deve ser verdadeiro, não falso. YMMV.fonte
imagealphablending
verdadeiro ou falso, sempre obtenho um fundo preto.Um acréscimo que pode ajudar algumas pessoas:
É possível alternar a combinação de imagem e combinação durante a construção da imagem. No caso específico de que precisava disso, queria combinar alguns PNGs semitransparentes em um fundo transparente.
Primeiro você define imagealphablending como false e preenche a imagem true color recém-criada com uma cor transparente. Se imagealphablending fosse true, nada aconteceria porque o preenchimento transparente se mesclaria com o fundo preto padrão e resultaria em preto.
Em seguida, você alterna imagealphablending para true e adiciona algumas imagens PNG à tela, deixando parte do fundo visível (ou seja, não preenchendo a imagem inteira).
O resultado é uma imagem com fundo transparente e várias imagens PNG combinadas.
fonte
Fiz uma função para redimensionar imagens como JPEG / GIF / PNG com
copyimageresample
e as imagens PNG ainda mantêm a transparência:fonte
$transparent = imagecolorallocatealpha($tmp, 255, 255, 255, 127);
imagefilledrectangle($tmp, 0, 0, $newwidth, $newheight, $transparent);
Suponho que isso possa resolver o problema:
A desvantagem é que a imagem será removida de todos os pixels verdes de 100%. De qualquer forma, espero que ajude :)
fonte
imagecreate(...)
funcionou. Você cria uma imagem, que é preenchida com a primeira cor que você alocar. Então você define essa cor como transparente. Se alphablending for definido como true para a imagem alvo, ambas as imagens serão mescladas e a transparência funcionará corretamente.Retirando a transparência de preservação, então sim, como afirmado em outras postagens, imagesavealpha () deve ser definido como verdadeiro, para usar o sinalizador alfa imagealphablending () deve ser definido como falso, caso contrário não funciona.
Também descobri duas coisas menores em seu código:
getimagesize()
para obter a largura / altura paraimagecopyresmapled()
$uploadWidth
e$uploadHeight
deve ser-1
o valor, já que o cordinates começa em0
e não1
, então ele iria copiá-los em um pixel vazio. Substituí-lo por:imagesx($targetImage) - 1
eimagesy($targetImage) - 1
, relativamente, deve servir :)fonte
Aqui está o meu código de teste total. Funciona para mim
fonte
Preste atenção à imagem de origem
width
e aosheight
valores que são passados para aimagecopyresampled
função. Se forem maiores do que o tamanho real da imagem de origem, o restante da área da imagem será preenchido com a cor preta.fonte
Combinei as respostas de ceejayoz e Cheekysoft, que deu o melhor resultado para mim. Sem imagealphablending () e imagesavealpha () a imagem não é clara:
fonte