如何使用PHP IMagick将CMYK / RGB TIFF转换为RGB JPEG

时间:2012-10-23 06:47:51

标签: php tiff imagick cmyk image-conversion

我有一个需要处理传入TIFF文件的PHP应用程序。我既不控制也不了解此TIFF的色彩空间,应用程序应将所有传入的图像存储为RGB JPEG。

问题是,传入的TIFF文件是什么:CMYK,RGB,some sort of YCbCr wrapped in sRGB等等,我需要在保存之前将它们以某种方式转换为RGB JPEG。

我需要在PHP中使用某种转换函数,它使用IMagick扩展,它可以获取任何二进制TIFF数据并将其转换为正确的RGB JPEG二进制数据。它需要处理TIFF图像中的不同颜色空间正确。任何输入文件的输出格式(RGB JPEG)都保持不变。

以下明显的解决方案正确转换了一些CMYK TIFF,一些CMYK TIFF变成了反色,YCbCr RGB TIFF被红色叠加完全破坏了:

$converter = new IMagick();
$converter->setResourceLimit(6, 1);
$converter->readImageBlob($data);

if ($converter->getImageColorspace() != IMagick::COLORSPACE_RGB
    && $converter->getImageColorspace() != IMagick::COLORSPACE_GRAY
) {
    $icc_rgb = file_get_contents('sRGB_v4_ICC_preference.icc');
    $converter->profileImage('icc', $icc_rgb);
    $converter->setImageColorspace(IMagick::COLORSPACE_RGB);
}

$converter->setImageFormat('jpeg');
$converter->setImageCompression(Imagick::COMPRESSION_JPEG);
$converter->setImageCompressionQuality(60);

$converter->resizeImage(1000, 1000, IMagick::FILTER_LANCZOS, 1, true);
$converter->stripImage();

$result = $converter->getImagesBlob();

这个解决方案来自那里:http://blog.rodneyrehm.de/archives/4-CMYK-Images-And-Browsers-And-ImageMagick.html显然,它不适用于所有颜色空间,因为它不能可靠地检测它们。如您所见,它甚至使用从it's homepage下载的sRGB_v4 ICC颜色配置文件。

Google为我找到了红色叠加问题的一个特殊解决方案(只是其中一个转换搞砸),但它只适用于控制台,当您事先知道 时,您处理的是YCbCr图像:< / p>

convert some.tif -set colorspace YCbCr -colorspace RGB some.jpg

我可以使用passthru - convert并传递以转换所需的所有神奇开关,但我想我需要预先检测源图像的颜色空间并在之前调用identify | grep其他PHP应用程序中的每个convert都是一种过度杀伤。

1 个答案:

答案 0 :(得分:0)

我遇到过同样的问题。 它也出现在imagick forums中,并且修正被推入ImageMagick 6.8.0-4。

因此升级应解决此问题。我已经升级到ImageMagick 6.8.1-9并且从那时起就没有遇到过这个。