Marca de agua obtener fondo negro cuando transparente

23

He instalado PATCH SUPEE 9767 en mi tienda magento 1.9.2.4.

Ahora he subido una nueva marca de agua pero el fondo cambia a negro.

¿Es esto un problema desde la nueva actualización? En otra instalación de magento 1.9.2.4 donde la actualización no está instalada, el fondo sigue siendo transparente.

Micro
fuente

Respuestas:

29

Tuve el mismo problema después de parchear 1.9.2.2 y 1.9.2.3. SUPEE-9767 agrega un método de validación extendido en

app / code / core / Mage / Core / Model / File / Validator / Image.php

La mía fue:

public function validate($filePath)
{
    $fileInfo = getimagesize($filePath);
    if (is_array($fileInfo) and isset($fileInfo[2])) {
        if ($this->isImageType($fileInfo[2])) {
            return null;
        }
    }
    throw Mage::exception('Mage_Core', Mage::helper('core')->__('Invalid MIME type.'));
}

Y cambiado a:

public function validate($filePath)
{
    list($imageWidth, $imageHeight, $fileType) = getimagesize($filePath);
    if ($fileType) {
        if ($this->isImageType($fileType)) {
            //replace tmp image with re-sampled copy to exclude images with malicious data
            $image = imagecreatefromstring(file_get_contents($filePath));
            if ($image !== false) {
                $img = imagecreatetruecolor($imageWidth, $imageHeight);
                imagecopyresampled($img, $image, 0, 0, 0, 0, $imageWidth, $imageHeight, $imageWidth, $imageHeight);
                switch ($fileType) {
                    case IMAGETYPE_GIF:
                        imagegif($img, $filePath);
                        break;
                    case IMAGETYPE_JPEG:
                        imagejpeg($img, $filePath, 100);
                        break;
                    case IMAGETYPE_PNG:
                        imagepng($img, $filePath);
                        break;
                    default:
                        return;
                }
                imagedestroy($img);
                imagedestroy($image);
                return null;
            } else {
                throw Mage::exception('Mage_Core', Mage::helper('core')->__('Invalid image.'));
            }
        }
    }
    throw Mage::exception('Mage_Core', Mage::helper('core')->__('Invalid MIME type.'));
}

El problema parece ser la imagecopyresampledllamada sin establecer primero la transparencia, ya que combina el fondo negro predeterminado de imagecreatetruecolor.

Lo que hice fue pasar imagecopyresampleda la declaración de cambio y agregar las llamadas de transparencia antes imagecopysampleden el caso de png (también puede usarlo para gif).

Entonces ahora mi if / switch se ve así:

if ($image !== false) {
    $img = imagecreatetruecolor($imageWidth, $imageHeight);

    switch ($fileType) {
        case IMAGETYPE_GIF:
            imagecopyresampled($img, $image, 0, 0, 0, 0, $imageWidth, $imageHeight, $imageWidth, $imageHeight);
            imagegif($img, $filePath);
            break;
        case IMAGETYPE_JPEG:
            imagecopyresampled($img, $image, 0, 0, 0, 0, $imageWidth, $imageHeight, $imageWidth, $imageHeight);
            imagejpeg($img, $filePath, 100);
            break;
        case IMAGETYPE_PNG:
            imagecolortransparent($img, imagecolorallocatealpha($img, 0, 0, 0, 127));
            imagealphablending($img, false);
            imagesavealpha($img, true);
            imagecopyresampled($img, $image, 0, 0, 0, 0, $imageWidth, $imageHeight, $imageWidth, $imageHeight);
            imagepng($img, $filePath);
            break;
        default:
            return;
    }
    imagedestroy($img);
    imagedestroy($image);
    return null;
}

Esto mantuvo mi transparencia png durante la carga de imágenes del producto. No sé si esto ayudará con la marca de agua y, obviamente, si usa esto, copie el archivo en su carpeta local.

app / code / local / Mage / Core / Model / File / Validator / Image.php

Tim Sullivan
fuente
¿Puedes abrir un problema en github.com/OpenMage/magento-lts ?
sv3n
me salvaste horas! ¡Gracias!
Michael Leiss
Por cierto, después de aplicar esto a mi Image.php, la carga de la imagen parece estar atascada en "Carga". Siempre. O__O ¿Alguien encontró el mismo problema?
jehzlau
He visto un sitio 1.9.2.3 sin el parche SUPEE-8788 problemas de carga administrativa después de parchear con SUPEE-9767.
Tim Sullivan el
1
@TimSullivan Probé tu solución pero no funcionó para mí.
Deepak Mankotia
3

Intentaría guardar la imagen nuevamente (tal vez con otro programa). Y si no ayuda, puede intentar esto:

app / code / local / Varien / Image / Adapter / Gd2.php y copie el contenido de /lib/Varien/Image/Adapter/Gd2.php

Cambio:

$this->_fillBackgroundColor($newImage);

A:

$this->_fillBackgroundColor($newImage, $frameWidth, $frameHeight);

Cambio:

if (!imagefill($imageResourceTo, 0, 0, $color)) {

A:

if (!imagefilledrectangle($imageResourceTo, 0, 0, $w, $h, $color)) {

Fuente: https://www.gravitywell.co.uk/latest/how-to/posts/fixing-black-magento-adds-to-image-backgrounds/


Editar: esto se ha solucionado en Magento 1.9.3.4 / SUPEE-9767 V2

app / code / core / Mage / Core / Model / File / Validator / Image.php

Cambiaron desde:

if ($image !== false) {
    $img = imagecreatetruecolor($imageWidth, $imageHeight);
    imagecopyresampled($img, $image, 0, 0, 0, 0, $imageWidth, $imageHeight, $imageWidth, $imageHeight);
    switch ($fileType) {
        case IMAGETYPE_GIF:
            imagegif($img, $filePath);
            break;
        case IMAGETYPE_JPEG:
            imagejpeg($img, $filePath, 100);
            break;
        case IMAGETYPE_PNG:
            imagepng($img, $filePath);
            break;
        default:
            return;
    }

A:

if ($image !== false) {
    $img = imagecreatetruecolor($imageWidth, $imageHeight);
    imagealphablending($img, false);
    imagecopyresampled($img, $image, 0, 0, 0, 0, $imageWidth, $imageHeight, $imageWidth, $imageHeight);
    imagesavealpha($img, true);

    switch ($fileType) {
         case IMAGETYPE_GIF:
            $transparencyIndex = imagecolortransparent($image);
            if ($transparencyIndex >= 0) {
                imagecolortransparent($img, $transparencyIndex);
                for ($y = 0; $y < $imageHeight; ++$y) {
                    for ($x = 0; $x < $imageWidth; ++$x) {
                        if (((imagecolorat($img, $x, $y) >> 24) & 0x7F)) {
                            imagesetpixel($img, $x, $y, $transparencyIndex);
                        }
                    }
                }
            }
            if (!imageistruecolor($image)) {
                imagetruecolortopalette($img, false, imagecolorstotal($image));
            }
            imagegif($img, $filePath);
            break;
        case IMAGETYPE_JPEG:
            imagejpeg($img, $filePath, 100);
            break;
        case IMAGETYPE_PNG:
            imagepng($img, $filePath);
            break;
        default:
            break;
    }
sv3n
fuente
Intenté su solución, primero, un error de lanzamiento de una variable indefinida y el segundo no funciona. Estoy usando magento 1.9.3.1
Deepak Mankotia
¿Has intentado aplicar el último parche completo SUPEE-9767 V2?
sv3n
Lo intenté después de aplicar el parche SUPEE-9767 V2
Deepak Mankotia
0

He creado un módulo Magento según la respuesta de Tim Sullivan que soluciona ese problema:

https://github.com/CopeX/PNGUploadFix

puntoiA
fuente
Intente proporcionar algunos detalles del código aquí en lugar de simplemente publicar un enlace.
Priyank
@pointiA Probé su módulo y no solucioné el problema por mí
Deepak Mankotia
0

He creado un archivo de parche que se instala fácilmente en su carpeta raíz de magento.

URL: Descargar desde aquí

Shashikant Singh
fuente
0

Descubrí que ajustar los archivos Image.php y GD2.php como se sugiere en las respuestas anteriores funciona, pero para mí significaba que las miniaturas JPEG que no estaban completamente cuadradas de repente tenían fondos negros. Entonces en GD2.php cambié

if (!imagefilledrectangle($imageResourceTo, 0, 0, $w, $h, $color)) {
            throw new Exception("Failed to fill image background with color {$r} {$g} {$b}.");
        }

a

if($this->_fileType == IMAGETYPE_JPEG){
        if (!imagefill($imageResourceTo, 0, 0, $color)) {
            throw new Exception("Failed to fill image background with color {$r} {$g} {$b}.");
        }
    } else {
        if (!imagefilledrectangle($imageResourceTo, 0, 0, $w, $h, $color)) {
            throw new Exception("Failed to fill image background with color {$r} {$g} {$b}.");
        }
    }

para mantener la antigua situación de los archivos JPEG.

Ogier Schelvis
fuente