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

简而言之,为什么需要 4:2:0:



我曾尝试将 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);

最佳答案

我对 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);

10-08 18:12