El siguiente fragmento de código PHP usa GD para cambiar el tamaño de un PNG cargado en el navegador a 128x128. Funciona muy bien, excepto que las áreas transparentes en la imagen original están siendo reemplazadas por un color sólido, negro en mi caso.
Aunque imagesavealphaestá configurado, algo no está del todo bien.
¿Cuál es la mejor forma de preservar la transparencia en la imagen remuestreada?
$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 = falseimportante aquí? El documento lo dice ... "Tienes que desarmar alphablending (imagealphablending($im, false)) para usarlo".imagecreatefrompng()sugiere queimagealphablendingdebería establecersetrue, lo cual es claramente incorrecto. Muchas gracias.¿Por qué haces las cosas tan complicadas? lo siguiente es lo que uso y hasta ahora me ha funcionado.
fuente
Creo que esto debería funcionar:
editar: Alguien en las afirmaciones de los documentos de PHP
imagealphablendingdebe ser verdadero, no falso. YMMV.fuente
imagealphablendingverdadero o falso, siempre obtengo un fondo negro.Una adición que podría ayudar a algunas personas:
Es posible alternar la combinación de alfabetos de imagen mientras se crea la imagen. En el caso específico de que necesitaba esto, quería combinar algunos PNG semitransparentes sobre un fondo transparente.
Primero, establezca imagealphablending en false y rellene la imagen de color verdadero recién creada con un color transparente. Si imagealphablending fuera verdadero, no pasaría nada porque el relleno transparente se fusionaría con el fondo negro predeterminado y resultaría en negro.
Luego, cambia imagealphablending a true y agrega algunas imágenes PNG al lienzo, dejando parte del fondo visible (es decir, sin llenar toda la imagen).
El resultado es una imagen con fondo transparente y varias imágenes PNG combinadas.
fuente
He creado una función para cambiar el tamaño de la imagen como JPEG / GIF / PNG
copyimageresampley las imágenes PNG aún mantienen su transparencia:fuente
$transparent = imagecolorallocatealpha($tmp, 255, 255, 255, 127);imagefilledrectangle($tmp, 0, 0, $newwidth, $newheight, $transparent);Supongo que esto podría hacer el truco:
La desventaja es que la imagen se eliminará de cada 100% de píxeles verdes. De todos modos, espero que ayude :)
fuente
imagecreate(...)embargo, usar esta respuesta con funcionó. Creas una imagen, que se llena con el primer color que asignas. Luego, estableces ese color en transparente. Si alphablending se establece en true para la imagen de destino, ambas imágenes se fusionarán y la transparencia funcionará correctamente.Al volver a calificar la transparencia de conservación, entonces sí, como se indica en otras publicaciones, imagesavealpha () debe establecerse en verdadero, para usar la bandera alfa, imagealphablending () debe establecerse en falso, de lo contrario no funciona.
También vi dos cosas menores en su código:
getimagesize()para obtener el ancho / alto paraimagecopyresmapled()$uploadWidthy$uploadHeightdebe ser-1el valor, ya que las coordenadas comienzan en0y no1, por lo que las copiaría en un píxel vacío. Reemplazarlo con:imagesx($targetImage) - 1yimagesy($targetImage) - 1, relativamente debería hacer :)fuente
Aquí está mi código de prueba total. Esto funciona para mi
fuente
Preste atención a la imagen de origen
widthy losheightvalores que se pasan a laimagecopyresampledfunción. Si son más grandes que el tamaño real de la imagen de origen, el resto del área de la imagen se rellenará con color negro.fuente
Combiné las respuestas de ceejayoz y Cheekysoft, que me dieron el mejor resultado. Sin imagealphablending () y imagesavealpha () la imagen no es clara:
fuente