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 imagesavealpha
está 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 = false
importante aquí? El documento lo dice ... "Tienes que desarmar alphablending (imagealphablending($im, false)
) para usarlo".imagecreatefrompng()
sugiere queimagealphablending
deberí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
imagealphablending
debe ser verdadero, no falso. YMMV.fuente
imagealphablending
verdadero 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
copyimageresample
y 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()
$uploadWidth
y$uploadHeight
debe ser-1
el valor, ya que las coordenadas comienzan en0
y no1
, por lo que las copiaría en un píxel vacío. Reemplazarlo con:imagesx($targetImage) - 1
yimagesy($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
width
y losheight
valores que se pasan a laimagecopyresampled
funció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