php - quitar - fondo transparente online gratis
Cómo reemplazar el fondo negro con blanco al redimensionar/convertir imágenes PNG con fondos transparentes a JPEG. (5)
Estoy usando una secuencia de comandos que permite a los usuarios subir imágenes. El script cambia el tamaño y convierte las imágenes a JPEG.
El problema que tengo es cuando se carga un PNG con transparencia, la imagen JPEG resultante es negra donde había transparencia.
¿Cómo puedo editar la secuencia de comandos siguiente para reemplazar el negro con blanco? Ya hace esto para GIF pero no para PNG.
// RESIZE IMAGE AND PUT IN USER DIRECTORY
switch($this->file_ext)
{
case "gif":
$file = imagecreatetruecolor($width, $height);
$new = imagecreatefromgif($this->file_tempname);
$kek=imagecolorallocate($file, 255, 255, 255);
imagefill($file,0,0,$kek);
imagecopyresampled($file, $new, 0, 0, 0, 0, $width, $height, $this->file_width, $this->file_height);
imagejpeg($file, $photo_dest, 100);
ImageDestroy($new);
ImageDestroy($file);
break;
case "bmp":
$file = imagecreatetruecolor($width, $height);
$new = $this->imagecreatefrombmp($this->file_tempname);
for($i=0; $i<256; $i++) { imagecolorallocate($file, $i, $i, $i); }
imagecopyresampled($file, $new, 0, 0, 0, 0, $width, $height, $this->file_width, $this->file_height);
imagejpeg($file, $photo_dest, 100);
ImageDestroy($new);
ImageDestroy($file);
break;
case "jpeg":
case "jpg":
$file = imagecreatetruecolor($width, $height);
$new = imagecreatefromjpeg($this->file_tempname);
for($i=0; $i<256; $i++) { imagecolorallocate($file, $i, $i, $i); }
imagecopyresampled($file, $new, 0, 0, 0, 0, $width, $height, $this->file_width, $this->file_height);
imagejpeg($file, $photo_dest, 100);
ImageDestroy($new);
ImageDestroy($file);
break;
case "png":
$file = imagecreatetruecolor($width, $height);
$new = imagecreatefrompng($this->file_tempname);
for($i=0; $i<256; $i++) { imagecolorallocate($file, $i, $i, $i); }
imagecopyresampled($file, $new, 0, 0, 0, 0, $width, $height, $this->file_width, $this->file_height);
imagejpeg($file, $photo_dest, 100);
ImageDestroy($new);
ImageDestroy($file);
break;
}
chmod($photo_dest, 0777);
return true;
}
Traté de editar el caso "png": parte para que coincida con el del caso "gif": código, pero el JPEG resultante es completamente blanco.
ACTUALIZAR:
Lo arreglé yo mismo.
Gracias, a todos, por contribuir!
He reemplazado:
case "png":
$file = imagecreatetruecolor($width, $height);
$new = imagecreatefrompng($this->file_tempname);
for($i=0; $i<256; $i++) { imagecolorallocate($file, $i, $i, $i); }
imagecopyresampled($file, $new, 0, 0, 0, 0, $width, $height, $this->file_width, $this->file_height);
imagejpeg($file, $photo_dest, 100);
ImageDestroy($new);
ImageDestroy($file);
break;
con:
case "png":
$file = imagecreatetruecolor($width, $height);
$new = imagecreatefrompng($this->file_tempname);
$kek=imagecolorallocate($file, 255, 255, 255);
imagefill($file,0,0,$kek);
imagecopyresampled($file, $new, 0, 0, 0, 0, $width, $height, $this->file_width, $this->file_height);
imagejpeg($file, $photo_dest, 100);
ImageDestroy($new);
ImageDestroy($file);
break;
Ok, esta función es de php. Como nunca he trabajado con imágenes en php, entonces no lo sabía.
Entonces, las imágenes se componen de tres colores: RGB (rojo, verde, azul). En el caso de PNG, también se compone de otro filtro, llamado alfa, que es la transparencia
ASÍ, solo para PNG, debe cambiar la imagecolorallocate
de la imagecolorallocatealpha($file,$i,$i,$i,$i);
imagecolorallocate
en la imagecolorallocate
de la imagen imagecolorallocatealpha($file,$i,$i,$i,$i);
Esto debería hacer que tus imágenes sean transparentes. ¿Esto resuelve su problema o realmente los necesita en fondo blanco?
Editar: También noté que estás usando la función de imagen y en todos los casos. Cambie a la función correspondiente, es decir, imagepng, imagebmp, imagegif
Pruebe de esta manera (no probado):
case "png":
$file = imagecreatetruecolor($width, $height);
$new = imagecreatefrompng($this->file_tempname);
imagefilledrectangle ($file, 0, 0, $width, $height, imagecolorallocate($file, 0,0,0))
(predibujar un fondo blanco en $ imagen de archivo)
Además, el for($i=0; $i<256; $i++) { imagecolorallocate($file, $i, $i, $i); }
for($i=0; $i<256; $i++) { imagecolorallocate($file, $i, $i, $i); }
parte se ve extraño.
switch($image_extension){
case ''gif'':
case ''GIF'':
$image_orig_resource = imagecreatefromgif($image_orig_path);
break;
case ''png'':
case ''PNG'':
$image_orig_resource = imagecreatefrompng($image_orig_path);
break;
case ''jpg'':
case ''jpeg'':
case ''JPG'':
case ''JPEG'':
$image_orig_resource = imagecreatefromjpeg($image_orig_path);
break;
default:
throw new Exception(''Extension not supported'');
}
$image_resource = imagecreatetruecolor($width, $height);
imagefill($image_resource, 0, 0, imagecolorallocate($image_resource, 255, 255, 255)); // white background;
imagecopyresampled($image_resource, $image_orig_resource, 0, 0, 0, 0, $width, $height, $image_orig_width, $image_orig_height);
imagejpeg($image_resource, $image_path, 100); // quality: [0-100]
Después del color verdadero de la imagen, agregue las líneas:
$file = imagecreatetruecolor($width, $height);
$background = imagecolorallocate($file, 0, 0, 0);
imagecolortransparent($file, $background);
imagealphablending($file, false);
imagesavealpha($file, true);
Esto ayudará a enviar por correo alfa para todos los formatos. Haga ping si no obtiene respuesta.
Encontré esta otra pregunta similar aquí en este sitio. Espero que sea útil.
agregar color de fondo a las imágenes transparentes usando gd y php