我有一个简单的水印脚本效果很好,但似乎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版本。
答案 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');
?>