Wasserzeichen erhalten schwarzen Hintergrund, wenn sie transparent sind

23

Ich habe PATCH SUPEE 9767 in meinem Magento 1.9.2.4 Shop installiert.

Jetzt habe ich ein neues Wasserzeichen hochgeladen, aber der Hintergrund wird schwarz.

Ist das ein Problem seit dem neuen Update? Bei einer anderen Magento 1.9.2.4-Installation, bei der das Update nicht installiert ist, ist der Hintergrund noch transparent.

Mike
quelle

Antworten:

29

Ich hatte das gleiche Problem nach dem Patchen von 1.9.2.2 und 1.9.2.3. SUPEE-9767 fügt eine erweiterte Validierungsmethode hinzu

app / code / core / Mage / Core / Modell / Datei / Validator / Image.php

Meins war:

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

Und geändert zu:

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

Das Problem scheint der imagecopyresampledAnruf zu sein, bei dem zunächst keine Transparenz festgelegt wird, da der standardmäßige schwarze Hintergrund von zusammengeführt wird imagecreatetruecolor.

Was ich getan habe, war, imagecopyresampledin die switch-Anweisung zu wechseln und die Transparenzaufrufe vorher imagecopysampledin den png-Fall einzufügen (Sie können sie auch für gif verwenden).

So, jetzt sieht mein if / switch so aus:

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

Dadurch blieb meine PNG-Transparenz beim Hochladen von Produktbildern erhalten. Ich weiß nicht, ob dies mit dem Wasserzeichen helfen wird und natürlich, wenn Sie dies tun, kopieren Sie die Datei in Ihren lokalen Ordner.

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

Tim Sullivan
quelle
Können Sie bitte ein Problem unter github.com/OpenMage/magento-lts eröffnen ?
Sv3n
Du hast mir Stunden gerettet! Danke!
Michael Leiss
Übrigens scheint das Hochladen von Bildern nach dem Anwenden auf meine Image.php bei "Hochladen" hängen zu bleiben. Für immer. O__O Ist jemand auf dasselbe Problem gestoßen?
Jehzlau
Ich habe eine 1.9.2.3-Site ohne das SUPEE-8788-Patch-Erlebnis gesehen. Nach dem Patching mit SUPEE-9767 treten beim Hochladen von Administratoren Probleme auf.
Tim Sullivan
1
@TimSullivan Ich habe Ihre Lösung ausprobiert, aber sie hat bei mir nicht funktioniert.
Deepak Mankotia
3

Ich würde versuchen, das Bild erneut zu speichern (möglicherweise mit einem anderen Programm). Und wenn es nicht hilft, können Sie dies versuchen:

app / code / local / Varien / Image / Adapter / Gd2.php und kopiere den Inhalt von /lib/Varien/Image/Adapter/Gd2.php

Veränderung:

$this->_fillBackgroundColor($newImage);

Zu:

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

Veränderung:

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

Zu:

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

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


Bearbeiten: Dies wurde in Magento 1.9.3.4 / SUPEE-9767 V2 behoben

app / code / core / Mage / Core / Modell / Datei / Validator / Image.php

Gewechselt von:

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

Zu:

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
quelle
Ich habe beide Lösungen ausprobiert. 1. Ein Fehler von undefinierter Variable und 2. funktioniert nicht. Ich benutze Magento 1.9.3.1
Deepak Mankotia
Haben Sie versucht, den neuesten Patch SUPEE-9767 V2 zu installieren?
SV3N
Ich habe versucht, nach dem Anwenden von SUPEE-9767 V2 Patch
Deepak Mankotia
0

Ich habe ein Magento-Modul gemäß der Antwort von Tim Sullivan erstellt, das dieses Problem behebt:

https://github.com/CopeX/PNGUploadFix

pointiA
quelle
Versuchen Sie, hier einige Code-Details anzugeben, anstatt nur einen Link zu posten.
Priyank
@pointiA Ich habe Ihr Modul ausprobiert und das Problem nicht für mich
behoben
0

Ich habe eine Patch-Datei erstellt, die sich einfach in Ihrem Magento-Root-Ordner installieren lässt.

URL: Hier herunterladen

Shashikant Singh
quelle
0

Ich fand, dass das Anpassen der Dateien Image.php und GD2.php wie in den obigen Antworten vorgeschlagen funktioniert, aber für mich bedeutete dies, dass JPEG-Miniaturansichten, die nicht vollständig quadratisch waren, plötzlich einen schwarzen Hintergrund hatten. Also habe ich mich in GD2.php geändert

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

zu

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

um die alte Situation für JPEG's zu behalten.

Ogier Schelvis
quelle