Le filigrane devient fond noir lorsqu'il est transparent


23

J'ai installé PATCH SUPEE 9767 sur ma boutique magento 1.9.2.4.

Maintenant, j'ai téléchargé un nouveau filigrane, mais l'arrière-plan devient noir.

Est-ce un problème depuis la nouvelle mise à jour? Sur une autre installation de magento 1.9.2.4 où la mise à jour n'est pas installée, l'arrière-plan est toujours transparent.

Réponses:


29

J'ai eu le même problème après avoir appliqué les correctifs 1.9.2.2 et 1.9.2.3. SUPEE-9767 ajoute une méthode de validation étendue dans

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

Le mien était:

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.'));
}

Et changé en:

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.'));
}

Le problème semble être l' imagecopyresampledappel sans définir d'abord la transparence car il fusionne le fond noir par défaut de imagecreatetruecolor.

Ce que j'ai fait était de passer imagecopyresampleddans l'instruction switch et d'ajouter les appels de transparence avant imagecopysampleddans le cas png (vous pouvez également l'utiliser pour gif).

Alors maintenant, mon if / switch ressemble à ceci:

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

Cela a gardé ma transparence png pendant les téléchargements d'images de produits. Je ne sais pas si cela vous aidera avec le filigrane et, évidemment, si vous l'utilisez, copiez le fichier dans votre dossier local.

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


Pouvez-vous s'il vous plaît ouvrir un problème sur github.com/OpenMage/magento-lts ?
sv3n

tu m'as fait gagner des heures! THX!
Michael Leiss

Btw, après avoir appliqué cela à mon Image.php, le téléchargement de l'image semble être bloqué sur "Téléchargement". Pour toujours. O__O Quelqu'un a rencontré le même problème?
jehzlau

J'ai vu un site 1.9.2.3 sans les problèmes de téléchargement d'admin avec l'expérience de patch SUPEE-8788 après avoir patché avec SUPEE-9767.
Tim Sullivan

1
@TimSullivan J'ai essayé votre solution mais cela n'a pas fonctionné pour moi.
Deepak Mankotia

3

J'essaierais de sauvegarder à nouveau l'image (peut-être avec un autre programme). Et si cela ne vous aide pas, vous pouvez essayer ceci:

app / code / local / Varien / Image / Adapter / Gd2.php et copiez le contenu de /lib/Varien/Image/Adapter/Gd2.php

Changement:

$this->_fillBackgroundColor($newImage);

À:

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

Changement:

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

À:

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

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


Edit: cela a été corrigé dans Magento 1.9.3.4 / SUPEE-9767 V2

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

Changé de:

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

À:

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

J'ai essayé votre première solution, la première erreur de projection d'une variable non définie et la seconde ne fonctionne pas. J'utilise magento 1.9.3.1
Deepak Mankotia

Avez-vous essayé d'appliquer le dernier patch complet SUPEE-9767 V2?
sv3n

J'ai essayé après avoir appliqué le patch SUPEE-9767 V2
Deepak Mankotia



0

J'ai trouvé que l'ajustement des fichiers Image.php et GD2.php comme suggéré dans les réponses ci-dessus fonctionne, mais pour moi, cela signifiait que les miniatures JPEG qui n'étaient pas complètement carrées avaient soudainement un arrière-plan noir. Donc, dans GD2.php, j'ai changé

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

à

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}.");
        }
    }

afin de conserver l'ancienne situation pour les JPEG.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.