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.

Mike
la source

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

Tim Sullivan
la source
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;
    }
sv3n
la source
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 créé un module Magento selon la réponse de Tim Sullivan qui corrige ce problème:

https://github.com/CopeX/PNGUploadFix

pointiA
la source
Essayez de fournir des détails sur le code ici plutôt que de simplement publier un lien.
Priyank
@pointiA J'ai essayé votre module et je n'ai pas résolu le problème pour moi
Deepak Mankotia
0

J'ai créé un fichier de correctif à installer facilement sur votre dossier racine magento.

URL: Téléchargez ici

Shashikant Singh
la source
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.

Ogier Schelvis
la source