Как масштабировать изображение png с прозрачностью?
я должен реализовать класс в PHP 5.6, где я должен масштабировать изображения jpeg/jpg, png и gif (очевидно, изображение сохраняет свой исходный формат). Однако изображение png должно сохранять прозрачность фона, если оно у вас есть.
до сих пор я могу масштабировать изображения, но не могу сохранить прозрачный фон исходного изображения, в противном случае цвет фона становится черным.
может кто-нибудь дать мне представление о том, как сохранить фон прозрачный?
Что касается кода, я сделал следующее:
( $imagen_tipo ){
case "image/jpg":
case "image/jpeg":
$imagen = imagecreatefromjpeg( $archivo );
break;
case "image/png":
$imagen = imagecreatefrompng( $archivo );
break;
case "image/gif":
$imagen = imagecreatefromgif( $archivo );
break;
}
$lienzo = imagecreatetruecolor( $miniatura_ancho, $miniatura_alto );//Crea el fondo donde se colocará la imagen
imagecopyresampled($lienzo, $imagen, 0, 0, 0, 0, $miniatura_ancho, $miniatura_alto, $imagen_ancho, $imagen_alto);//Copia y cambia el tamaño de parte de una imagen redimensionándola
if($imagen_tipo == "image/jpg" || $imagen_tipo =="image/jpeg"){
imagejpeg($lienzo, $path.$formatoYNombreImagen[0]."-".$heighTamano[$i].".".$formatoYNombreImagen[1], 80);
}else if( $imagen_tipo == "image/png" ){
imagepng($lienzo, $path.$formatoYNombreImagen[0]."-".$heighTamano[$i].".".$formatoYNombreImagen[1], 80);
}else if ($imagen_tipo == "image/gif"){
imagegif($lienzo, $path.$formatoYNombreImagen[0]."-".$heighTamano[$i].".".$formatoYNombreImagen[1], 80);
}
2 answers
Перед использованием функции imagecopyresampled () я думаю, вы должны установить blending на false и установить imagesavealphachannel на true и добавить еще пару вещей.
( $imagen_tipo ){
case "image/jpg":
case "image/jpeg":
$imagen = imagecreatefromjpeg( $archivo );
break;
case "image/png":
$imagen = imagecreatefrompng( $archivo );
break;
case "image/gif":
$imagen = imagecreatefromgif( $archivo );
break;
}
$lienzo = imagecreatetruecolor( $miniatura_ancho, $miniatura_alto );//Crea el fondo donde se colocará la imagen
imagealphablending($lienzo, false);
imagesavealpha($lienzo,true);
$transparent = imagecolorallocatealpha($lienzo, 255, 255, 255, 127);
imagefilledrectangle($lienzo, 0, 0, $miniatura_ancho, $miniatura_alto, $transparent);
imagecopyresampled($lienzo, $imagen, 0, 0, 0, 0, $miniatura_ancho, $miniatura_alto, $imagen_ancho, $imagen_alto);//Copia y cambia el tamaño de parte de una imagen redimensionándola
if($imagen_tipo == "image/jpg" || $imagen_tipo =="image/jpeg"){
imagejpeg($lienzo, $path.$formatoYNombreImagen[0]."-".$heighTamano[$i].".".$formatoYNombreImagen[1], 80);
}else if( $imagen_tipo == "image/png" ){
imagepng($lienzo, $path.$formatoYNombreImagen[0]."-".$heighTamano[$i].".".$formatoYNombreImagen[1], 80);
}else if ($imagen_tipo == "image/gif"){
imagegif($lienzo, $path.$formatoYNombreImagen[0]."-".$heighTamano[$i].".".$formatoYNombreImagen[1], 80);
}
Все последнее работает, если непрозрачность прозрачного фона равна 0. если она отличается от 0, она будет следовать.
EDIT: это перевод ответа, сделанного пользователем Dycey. Спасибо за информацию.
Намного проще добавить эти строки:
imagesavealpha($gdImage, true);
imagealphablending($gdImage, true);
Ниже:
$gdImage = imagecreatefrompng($logo);