如何使用Imagick将JPG图像保存在4:2:0颜色空间中?

时间:2014-11-25 16:37:07

标签: php imagick

Google Pagespeed可以将RGB图像转换为YUV 4:2:0色彩空间。我想在PHP中使用imagick做同样的事情。

简单地说,为什么需要4:2:0:

  

"此过滤器将jpeg图像的颜色采样减少到4:2:0。人的   视觉对亮度的变化比变化更敏感   色调或饱和度,4:2:0颜色采样允许我们保持   亮度数据,同时减少色调和饱和度数据   按3/4。这可以显着减小图像尺寸,同时只有   对感知的影响很小。"

我试图用imagemagick将颜色空间更改为YUV,但它根本不能正常工作!白色背景变为绿色,其余颜色错误,加上反转亮度。

以下代码没用,但它显示了我尝试过的一些内容。

使用mod_pagespeed创建的Google格式,结果图像在浏览器中看起来很好。这就是我希望实现的,用于网络的图像。

    $image_info = getimagesize($source_file);
    $im = new Imagick();
    $im->readImage($source_file);
    $profiles = $im->getImageProfiles('*', false);
    $has_icc_profile = (array_search('icc', $profiles) !== false);
    if ($has_icc_profile === false) {
        $icc_srgb = file_get_contents(Mage::getBaseDir('var') . DS . 'metodo' . DS . 'demo_data' . DS . 'AdobeRGB1998.icc');
        $im->profileImage('icc', $icc_srgb);
        unset($icc_srgb);
    }
    //$im->setImageColorspace(1);
    $im->setInterlaceScheme(Imagick::INTERLACE_PLANE);
    $im->setImageCompressionQuality(85);
    //$im->stripImage(); 
    $im->setImageColorspace(11);
    $im->thumbnailImage($this->_imageSrcWidth, $this->_imageSrcHeight);
    //$im->negateImage(false, Imagick::CHANNEL_ALL);
    $im->stripImage();
    $im->writeImage($fileName);

2 个答案:

答案 0 :(得分:9)

我对Imagick::setSamplingFactors方法缺乏文档感到好奇(见my comment),所以我试图弄明白。

使用Imagick::identifyImage方法很明显,Imagick库不使用4:2:0表示法进行色度子采样,但类似'1x1,1x1,1x1'。在http://www.ftgimp.com/help/C/filters/jpeg.html(20180608:不再可用,archived here),明确表示'1x1,1x1,1x1'转换为4:4:4,'2x2,1x1,1x1'转换为4:2 :0。由于Imagick::setSamplingFactors方法需要一个数组作为参数,我尝试了以下方法,该方法成功运行:

$img = new Imagick($source_file)
$img->setSamplingFactors(array('2x2', '1x1', '1x1'));
$im->writeImage($fileName);

答案 1 :(得分:2)

在技术上可能不是一个答案,但格式化评论太尴尬了,这可能有助于找到答案。

你可以做一些这样的事情,可以提供一些关于如何使用参数以及它们似乎做什么的见解:

convert input.jpg -colorspace YUV out.jpg
convert input.jpg -colorspace YUV -sampling-factor 4:2:2 out442.jpg
convert input.jpg -colorspace YUV -sampling-factor 4:2:0 out420.jpg

然后您可以查看各种设置的结果文件大小。看起来输出文件大小与采样相关性很好,并且IM的默认采样是4:4:4,因为当我没有提供任何-sampling-factor时,它与大小匹配:

ls -l out*
-rw-r--r--  1 mark  staff  105563 26 Nov 10:23 out.jpg
-rw-r--r--  1 mark  staff   77230 26 Nov 10:23 out410.jpg
-rw-r--r--  1 mark  staff   81755 26 Nov 10:24 out411.jpg
-rw-r--r--  1 mark  staff   82835 26 Nov 10:23 out420.jpg
-rw-r--r--  1 mark  staff  105563 26 Nov 10:25 out444.jpg

link可能会有所帮助。

相关问题