PHP Imagick复合丢失sRGB色彩质量为何?

时间:2014-05-28 06:16:50

标签: php imagemagick imagick

我有一个简单的水印脚本效果很好,但似乎adobe sRGB图像失去了色彩质量。

通过shell / imagemagick运行水印命令效果很好 - 没有丢失颜色质量。

然而,使用imagick会使颜色变钝。

以下是我使用的一系列命令:

    $image = new Imagick();
    $image->readImage($this->source_path);

    $watermark = new Imagick();
    $watermark->readImage($this->watermark_path);

    // how big are the images?
    $iWidth = $image->getImageWidth();
    $iHeight = $image->getImageHeight();
    $wWidth = $watermark->getImageWidth();
    $wHeight = $watermark->getImageHeight();

    // calculate the position
    $x = ( $iWidth - $wWidth ) / 2;
    $y = ( $iHeight - $wHeight ) / 2;

    //we have to make the transparency go to white, or it will become an awefull black color in jpeg version        
    $white = new Imagick();

    $white->newImage($image->getImageWidth(), $image->getImageHeight(), "white");

    if ($image->getImageColorspace() == Imagick::COLORSPACE_SRGB) { 
        $watermark->setColorspace(imagick::COLORSPACE_RGB);
        $white->setColorspace(imagick::COLORSPACE_RGB);
    }

    $white->compositeimage($image, Imagick::COMPOSITE_OVER, 0, 0);

    //now apply watermark
    $white->compositeImage($watermark, imagick::COMPOSITE_OVER, $x, $y);

    //save
    $white->writeImage($this->destination);

    //save memory
    $image->destroy();
    $white->destroy();

我做了一个半教育的假设,如果我将其他两个元素(白色背景和png叠加)转换为sRGB,那么什么都不会丢失。我在这里用这个部分做了那个:

    if ($image->getImageColorspace() == Imagick::COLORSPACE_SRGB) { 
        $watermark->setColorspace(imagick::COLORSPACE_RGB);
        $white->setColorspace(imagick::COLORSPACE_RGB);
    }

......仍然没有虾中尉丹...

有没有办法解决这个问题?理想情况下,我想使用shell命令,但我想为那些在他们的环境中没有shell访问权限的人完善imagick版本。

1 个答案:

答案 0 :(得分:3)

我在这里找到了解决方案:http://www.php.net/manual/ru/imagick.compositeimage.php(就像一个寻宝者!)

上述链接中提出的解决方案:

  

组合两个时,您可能需要将颜色空间设置为相同   彼此的图像

<?php
//Creating two Imagick object
$first = new Imagick('first.jpg');
$second = new Imagick('second.jpg');

// Set the colorspace to the same value
$first->setImageColorspace($second->getImageColorspace() );

//Second image is put on top of the first
$first->compositeImage($second, $second->getImageCompose(), 5, 5);

//new image is saved as final.jpg
$first->writeImage('final.jpg');
?>