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.

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


¿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;
    }

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

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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.