【问题标题】:Magento resize() image quality: dirty white backgroundMagento resize() 图像质量:肮脏的白色背景
【发布时间】:2012-01-13 03:44:26
【问题描述】:

我有一个客户对他们的产品缩略图在 Magento 上的呈现方式非常不满意。

狡猾的外观在两个帐户上很明显:

  • 有一个肮脏的白色背景,有非常浅灰色的水平线
  • 其次,色彩损失非常轻微(失去对比度和饱和度)。

我已经删除了所有压缩,将所有质量设置为 100%,刷新了图像缓存,进行了数十次实验、损坏和修复,但似乎没有任何效果。

这个版本的 Magento 是 ver。 1.4.2.0

这里有没有人遇到同样的问题,如果有,你解决了吗?

【问题讨论】:

标签: magento thumbnails gd2


【解决方案1】:

问题与 lib/Varien/Image/Adapter/Gd2.php 中的 resize 函数中的 php 函数 imagecopyresampled 有关,为了平滑调整大小的图像会出现一些舍入问题。

我的解决方案是在调整图像大小后将图像中任何非常浅灰色的像素简单地更改为纯白色。为此,首先将 lib/Varien/Image/Adapter/Gd2.php 复制到 app/code/local/Varien/Image/Adapter/Gd2.php

接下来在 resize 函数中找到以下代码(大约第 312 行)

// resample source image and copy it into new frame
imagecopyresampled(
    $newImage,
    $this->_imageHandler,
    $dstX, $dstY,
    $srcX, $srcY,
    $dstWidth, $dstHeight,
    $this->_imageSrcWidth, $this->_imageSrcHeight
);

然后在下面添加如下代码:

// Clean noise on white background images
if ($isTrueColor) {
    $colorWhite = imagecolorallocate($newImage,255,255,255);
    $processHeight = $dstHeight+$dstY;
    $processWidth = $dstWidth+$dstX;
    //Travel y axis
    for($y=$dstY; $y<($processHeight); ++$y){
        // Travel x axis
        for($x=$dstX; $x<($processWidth); ++$x){
            // Change pixel color
            $colorat=imagecolorat($newImage, $x, $y);
            $r = ($colorat >> 16) & 0xFF;
            $g = ($colorat >> 8) & 0xFF;
            $b = $colorat & 0xFF;
            if(($r==253 && $g == 253 && $b ==253) || ($r==254 && $g == 254 && $b ==254)) {
                imagesetpixel($newImage, $x, $y, $colorWhite);
            }
        }
    }
}

从 Magento 的缓存管理中刷新图像缓存,您应该有更好的图像用于新显示器。实现这一点时需要注意的一点是,第一次再次生成图像时性能会受到小幅影响,并且由于非常浅的灰色已被移除,带有阴影的图像可能具有更清晰的边缘。

【讨论】:

  • 完美!太感谢了!这消除了背景噪音。但是我仍然遇到颜色丢失的问题 - 缩略图看起来比上传的原始文件暗得多有什么想法吗?
  • 不,我认为总会有一些质量损失。如果颜色差异很大,请确保您上传的照片是 RGB 而不是 CMYK,因为它们会转换为 RGB 颜色模式。
  • 完美解决方案。谢谢(鞠躬)
  • 效果很好。我们只是有性能问题。处理更大尺寸的图像需要时间。
【解决方案2】:

将图像上传为 PNG。它们可能不如 JPG 小,但它让我们避免了 Magento 的调整大小功能造成的一些图像质量问题。

【讨论】:

    【解决方案3】:

    我的一些图像也遇到了同样的问题,后来我意识到那些分辨率较低的图像失真了,尝试使用大于 1100 X 1100 的图像,它应该可以正常工作!

    【讨论】:

      【解决方案4】:

      试试下面的例子

      echo Mage::helper('catalog/image')->init($product, 'small_image')->resize(180, 210)->setQuality(50);
      

      【讨论】:

      • 这对我很有用。提醒一下,我使用了 Varien_Image 对象,并且只需要使用 -&gt;quality(50) 而不是 -&gt;setQuality(50)
      • setQuality(50)setQuality(100) 对我们来说效果不佳,但 setQuality(95) 效果很好。
      • 这不是一个整体的压缩伪影问题,这是一个“白色背景上的灰色脏线”问题。这个答案应该在这里:stackoverflow.com/questions/10841236/…
      【解决方案5】:

      您可以将自己的 Gd2.php 文件放在本地 (app/code/local/Varien/Image/Adapter/Gd2.php) 并将质量硬连接到 100%。

      质量对我有用,所以我没有这样做。

      您还可以在其中放置图像卷积以锐化图像,这样您就可以通过锐化来补偿调整大小的模糊,例如将以下内容放在“调整大小”函数的末尾:

          $sharpenMatrix = array(array(-1,-1,-1),array(-1,24,-1),array(-1,-1,-1));
          $divisor = 16;
          $offset = 0;
          imageconvolution($newImage, $sharpenMatrix, $divisor, $offset);
      

      【讨论】:

        【解决方案6】:

        快速 grep 显示您可以在 product_image 对象上设置它

        app/code/core/Mage/Catalog/Helper/Image.php:105:     * Set image quality, values in percentage from 0 to 100
        app/code/core/Mage/Catalog/Helper/Image.php:107:     * @param int $quality
        app/code/core/Mage/Catalog/Helper/Image.php:110:    public function setQuality($quality)
        app/code/core/Mage/Catalog/Helper/Image.php:112:        $this->_getModel()->setQuality($quality);
        app/code/core/Mage/Catalog/Model/Product/Image.php:38:    protected $_quality = 90;
        app/code/core/Mage/Catalog/Model/Product/Image.php:88:     * Set image quality, values in percentage from 0 to 100
        app/code/core/Mage/Catalog/Model/Product/Image.php:90:     * @param int $quality
        app/code/core/Mage/Catalog/Model/Product/Image.php:93:    public function setQuality($quality)
        app/code/core/Mage/Catalog/Model/Product/Image.php:95:        $this->_quality = $quality;
        app/code/core/Mage/Catalog/Model/Product/Image.php:100:     * Get image quality
        app/code/core/Mage/Catalog/Model/Product/Image.php:106:        return $this->_quality;
        app/code/core/Mage/Catalog/Model/Product/Image.php:331:                'quality' . $this->_quality
        app/code/core/Mage/Catalog/Model/Product/Image.php:387:        $this->_processor->quality($this->_quality);
        

        【讨论】:

        • 我已经将这些设置为 100%,但仍然没有变化。我怀疑这与托管在服务器上的 GD2 插件有关,而不是与 Magento 有关。
        • 你可以检查你的 zend 库 gd 选项,这些文件在哪里调用它们的方法
        【解决方案7】:

        我在其中一个项目中遇到了图像质量问题。但问题不在后端,而在前端。图片质量很差,因为 CSS 中给定的图片宽度和高度与图片文件的不同。

        【讨论】:

          猜你喜欢
          • 2011-06-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-07-28
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多