水印透明时会变成黑色背景


23

我已经在magento 1.9.2.4商店中安装了PATCH SUPEE 9767。

现在,我上传了一个新的水印,但是背景变为黑色。

自新更新以来,这是一个问题吗?在未安装更新的其他magento 1.9.2.4安装中,背景仍然透明。

Answers:


29

修补1.9.2.2和1.9.2.3。之后,我遇到了相同的问题。SUPEE-9767在以下位置添加了扩展的验证方法

应用程序/代码/核心/法师/核心/模型/文件/验证器/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的透明度。不知道这是否会对水印有所帮助,显然如果您确实使用了此功能,则将文件复制到本地文件夹中。

应用程序/代码/本地/法师/核心/模型/文件/验证器/Image.php


您能否在github.com/OpenMage/magento-lts中打开问题?
sv3n

您节省了我几个小时!谢谢!
Michael Leiss

顺便说一句,将其应用到我的Image.php后,图像的上传似乎停留在“上传”上。永远。O__O有人遇到过同样的问题吗?
jehzlau

我看到一个1.9.2.3站点没有SUPEE-8788补丁程序,但在通过SUPEE-9767进行补丁程序后管理员上传问题。
蒂姆·沙利文

1
@TimSullivan我尝试了您的解决方案,但不适用于我。
Deepak Mankotia

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中修复。

应用程序/代码/核心/法师/核心/模型/文件/验证器/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;
    }

我尝试了两种方法,第一种方法是抛出未定义变量的错误,第二种方法不起作用。我正在使用magento 1.9.3.1
Deepak Mankotia

您是否尝试应用完整的最新补丁SUPEE-9767 V2?
sv3n

我在应用SUPEE-9767 V2补丁后曾尝试过
Deepak Mankotia



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的旧情况。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.