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


Я установил ПАТЧ SUPEE 9767 в своем магазине magento 1.9.2.4.

Теперь я загрузил новый водяной знак, но фон меняется на черный.

Является ли это проблемой после нового обновления? В другой установке magento 1.9.2.4, где обновление не установлено, фон все еще прозрачен.

Author: sv3n, 2017-06-01

5 answers

У меня была та же проблема после исправления 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 в оператор switch и добавил вызовы прозрачности перед imagecopysampled в случае png (вы также можете использовать его для gif).

Итак, теперь мой переключатель if/выглядит так:

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

 29
Author: Tim Sullivan, 2017-06-15 01:13:14

Я бы попытался сохранить изображение снова (возможно, с помощью другой программы). И если это не поможет, вы можете попробовать следующее:

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;
    }
 3
Author: sv3n, 2017-07-21 10:18:09

Я создал модуль Magento в соответствии с ответом Тима Салливана, который устраняет эту проблему:

Https://github.com/CopeX/PNGUploadFix

 0
Author: pointiA, 2017-07-05 06:28:51

Я создал файл исправления, который легко установить в корневую папку magento.

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

 0
Author: Shashikant Singh, 2017-07-21 10:02:55

Я обнаружил, что корректировка файлов 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.

 0
Author: Ogier Schelvis, 2017-09-05 09:17:50