¿Cómo escalar una imagen png con transparencia?

publicado por: Anonymous

Debo implementar una clase en PHP 5.6 donde debo escalar imágenes jpeg/jpg, png y gif (obviamente la imagen conserva su formato original) . Sin embargo, la imagen png debe conservar la transparencia del fondo en caso de tenerla.

Hasta ahorita, puedo escalar las imágenes pero no puedo conservar el fondo transparente de la imagen original, en su defecto, el color de fondo se vuelve negro.

¿Alguien puede darme una idea de cómo conservar el fondo transparente?

En cuanto al código, hice lo siguiente:

( $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);
}

solución

antes de usar la función imagecopyresampled() creo que deberías setear el blending a falso y setear imagesavealphachannel a true y agregar un par de cosas más.

    ( $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);
    }

Todo esto último funciona si la opacidad del fondo transparente es igual a 0. Si es distinta de 0 va a seguir.

EDIT: esta es una traducción de una respuesta realizada por el usuario Dycey. Gracias por la información.

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *