Znak wodny na czarnym tle staje się przezroczysty

23

Zainstalowałem PATCH SUPEE 9767 w moim sklepie Magento 1.9.2.4.

Teraz przesłałem nowy znak wodny, ale tło zmienia się na czarne.

Czy to problem od czasu nowej aktualizacji? W innej instalacji Magento 1.9.2.4, w której aktualizacja nie jest zainstalowana, tło jest nadal przezroczyste.

Mikrofon
źródło

Odpowiedzi:

29

Miałem ten sam problem po aktualizacji 1.9.2.2 i 1.9.2.3. SUPEE-9767 dodaje rozszerzoną metodę sprawdzania poprawności w

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

Moje było:

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

I zmieniłem na:

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

Problemem wydaje się być imagecopyresampledpołączenie bez uprzedniego ustawienia przezroczystości, ponieważ łączy ono domyślne czarne tło imagecreatetruecolor.

To, co zrobiłem, to przejście imagecopyresampleddo instrukcji switch i dodanie wcześniej wywołań przezroczystości imagecopysampledw przypadku png (możesz go również użyć do gif).

Więc teraz mój if / switch wygląda następująco:

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

Dzięki temu zachowałem przejrzystość png podczas przesyłania zdjęć produktów. Nie wiem, czy to pomoże ze znakiem wodnym i oczywiście jeśli użyjesz tej kopii, skopiuj plik do lokalnego folderu.

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

Tim Sullivan
źródło
Czy możesz otworzyć problem na github.com/OpenMage/magento-lts ?
sv3n
oszczędziłeś mi godziny! dzięki!
Michael Leiss,
Przy okazji, po zastosowaniu tego do mojego Image.php, Przesyłanie obrazu wydaje się być zablokowane na „Przesyłanie”. Na zawsze. O__O Ktoś napotkał ten sam problem?
jehzlau
Widziałem witrynę 1.9.2.3 bez problemów z przesyłaniem przez administratora SUPEE-8788 po łatce z SUPEE-9767.
Tim Sullivan
1
@TimSullivan Próbowałem twojego rozwiązania, ale nie działało dla mnie.
Deepak Mankotia
3

Spróbuję ponownie zapisać obraz (może z innym programem). A jeśli to nie pomoże, możesz spróbować:

app / code / local / Varien / Image / Adapter / Gd2.php i skopiuj zawartość pliku /lib/Varien/Image/Adapter/Gd2.php

Zmiana:

$this->_fillBackgroundColor($newImage);

Do:

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

Zmiana:

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

Do:

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

Źródło: https://www.gravitywell.co.uk/latest/how-to/posts/fixing-black-magento-adds-to-image-backgrounds/


Edycja: naprawiono to w Magento 1.9.3.4 / SUPEE-9767 V2

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

Zmieniony z:

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

Do:

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
źródło
Próbowałem obu rozwiązań. Pierwszy błąd zgłaszania niezdefiniowanej zmiennej, a drugi nie działa. Używam magento 1.9.3.1
Deepak Mankotia
Czy próbowałeś zastosować pełną najnowszą łatkę SUPEE-9767 V2?
sv3n
Próbowałem po zastosowaniu poprawki SUPEE-9767 V2
Deepak Mankotia
0

Stworzyłem moduł Magento zgodnie z odpowiedzią Tima Sullivana, który rozwiązuje ten problem:

https://github.com/CopeX/PNGUploadFix

pointiA
źródło
Spróbuj podać tutaj niektóre szczegóły kodu, a nie tylko publikować link.
Priyank
@pointiA Wypróbowałem twój moduł i nie naprawiłem problemu
Deepak Mankotia
0

Stworzyłem plik łatki, który łatwo zainstalować w folderze głównym Magento.

URL: Pobierz stąd

Shashikant Singh
źródło
0

Przekonałem się, że dostosowanie plików Image.php i GD2.php, jak sugerowano w powyższych odpowiedziach, działa, ale dla mnie oznaczało to, że miniatury JPEG, które nie były całkowicie kwadratowe, nagle miały czarne tło. W GD2.php zmieniłem się

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

do

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

w celu zachowania starej sytuacji dla plików JPEG.

Ogier Schelvis
źródło