Как масштабировать изображение 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);
}
 1
php
Author: Muriano, 2016-12-10

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. Спасибо за информацию.

 3
Author: sebasaenz, 2016-12-10 22:19:40

Намного проще добавить эти строки:

imagesavealpha($gdImage, true);
imagealphablending($gdImage, true);

Ниже:

$gdImage = imagecreatefrompng($logo);
 1
Author: Sergio Renato, 2019-06-06 20:47:48