【发布时间】:2012-10-23 06:47:50
【问题描述】:
我有一个 PHP 应用程序需要处理传入的 TIFF 文件。我既不控制也不了解此 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 图像时:
convert some.tif -set colorspace YCbCr -colorspace RGB some.jpg
我可以忍受passthru-ing convert 并通过转换所有需要的神奇开关,但我想我需要事先检测源图像的色彩空间并在每个convert 之前调用identify | grep否则 PHP 应用程序就大材小用了。
【问题讨论】:
标签: php tiff imagick cmyk image-conversion