Водяной знак становится черным, когда прозрачный

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 добавляет расширенный метод проверки в

Приложение / код / ​​ядро ​​/ Mage / Ядро / Модель / Файл / Оценщик / 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в оператор switch и добавил вызовы прозрачности ранее 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 во время загрузки изображений товаров. Не знаю, поможет ли это с водяным знаком, и, очевидно, если вы его используете, скопируйте файл в локальную папку.

Приложение / код / ​​местные / Mage / Ядро / Модель / Файл / Оценщик / image.php

Тим Салливан
источник
Не могли бы вы открыть вопрос по адресу github.com/OpenMage/magento-lts ?
sv3n
ты сэкономил мне часы! Спасибо!
Майкл Лейсс
Кстати, после применения этого к моему 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

Приложение / код / ​​ядро ​​/ Mage / Ядро / Модель / Файл / Оценщик / 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;
    }
sv3n
источник
Я пробовал оба решения: 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
источник
Попробуйте указать здесь некоторые детали кода, а не просто опубликовать ссылку.
Приянк
@pointiA Я попробовал твой модуль и не
решил
0

У меня есть файл патча, который легко установить в корневую папку вашего magento.

URL: скачать отсюда

Шашикант Сингх
источник
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.

Ожье Шелвис
источник