我有一个 PHP 应用程序需要处理传入的 TIFF 文件。我对这个 TIFF 的色彩空间既没有控制也没有知识,应用程序应该将所有传入的图像存储为 RGB JPEG。
问题是,传入的 TIFF 文件是任何东西:CMYK、RGB、某种包装在 sRGB 中的 YCbCr等等,我需要在保存之前以某种方式将它们转换为 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显然,它不适用于所有色彩空间,因为它不可靠地检测它们。如您所见,它甚至使用从其主页下载的 sRGB_v4 ICC 颜色配置文件。
谷歌为我找到了红色覆盖问题的一个特殊解决方案(只是转换错误之一),但它仅适用于控制台,并且当您事先知道您处理 YCbCr 图像时:
convert some.tif -set colorspace YCbCr -colorspace RGB some.jpg
我可以忍受passthru
-ingconvert
和 pass 来转换所有需要的神奇开关,但我想我需要事先检测源图像的色彩空间并在 PHP 应用程序中调用 a identify | grep
before everyconvert
是一种矫枉过正。