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.

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


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

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 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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.