Водяний знак отримує чорний фон, коли прозорий


23

Я встановив PATCH SUPEE 9767 у своєму магазині magento 1.9.2.4.

Тепер я завантажив новий Водяний знак, але фон змінюється на чорний.

Це проблема з нового оновлення? Для іншої установки magento 1.9.2.4, де оновлення не встановлено, фон все ще прозорий.

Відповіді:


29

У мене була така ж проблема після виправлення 1.9.2.2 та 1.9.2.3. SUPEE-9767 додає розширений метод підтвердження в

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

Моя була:

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

І змінено на:

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

Здається, проблема полягає у imagecopyresampledвиклику без встановлення прозорості спочатку, оскільки він об'єднує чорний фон за замовчуванням imagecreatetruecolor.

Що я зробив, це перейти imagecopyresampledдо оператора перемикання і додати виклики прозорості раніше, ніж imagecopysampledу випадку png (ви також можете використовувати його для gif).

Тож тепер мій if / switch виглядає так:

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

Це зберегло мою прозорість png під час завантаження зображення продукту. Не знаєте, чи це допоможе з водяним знаком, і очевидно, якщо ви скористаєтеся цією копією файлу у вашій локальній папці.

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


Чи можете ви, будь ласка, відкрити проблему на сайті github.com/OpenMage/magento-lts ?
sv3n

ти врятував мене години! Дякую!
Майкл Лейс

Btw, застосувавши це до мого Image.php, завантаження зображення, схоже, застрягло у "Завантаження". Назавжди. O__O Хтось стикався з тією ж проблемою?
jehzlau

Я бачив сайт 1.9.2.3 без проблем із завантаженням патча SUPEE-8788 після виправлення з SUPEE-9767.
Тім Салліван

1
@TimSullivan Я спробував ваше рішення, але не працював на мене.
Діпак Манкотія

3

Я б спробував зберегти зображення ще раз (можливо, за допомогою іншої програми). І якщо це не допомагає, ви можете спробувати це:

app / code / local / Varien / Image / Adapter / Gd2.php та скопіюйте вміст /lib/Varien/Image/Adapter/Gd2.php

Змінити:

$this->_fillBackgroundColor($newImage);

До:

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

Змінити:

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

До:

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

Джерело: https://www.gravitywell.co.uk/latest/how-to/posts/fixing-black-magento-adds-to-image-backgrounds/


Редагувати: це було виправлено у Magento 1.9.3.4 / SUPEE-9767 V2

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

Змінено з:

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

Я спробував ваше обидва рішення 1-а одна помилка кидання невизначеної змінної, а друга не працює. Я використовую magento 1.9.3.1
Deepak Mankotia

Ви намагалися застосувати повний останній патч SUPEE-9767 V2?
sv3n

Я намагався після застосування патчу SUPEE-9767 V2
Deepak Mankotia

0

Я створив модуль Magento відповідно до відповіді Тіма Саллівана, який вирішує цю проблему:

https://github.com/CopeX/PNGUploadFix


Спробуйте вказати тут деякі деталі коду, а не просто розмістити посилання.
Приянк

@pointiA Я спробував ваш модуль і не
вирішив


0

Я виявив, що коригування файлів Image.php та GD2.php, як було запропоновано вище, відповідає, але для мене це означало, що ескізи JPEG, які не були абсолютно квадратними, раптом мали чорні фони. Тож у GD2.php я змінився

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

щоб зберегти стару ситуацію для JPEG.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.