带有CMYK色彩空间的Delphi XE和JPG(检测和/或转换)

时间:2014-09-14 11:03:30

标签: delphi jpeg delphi-xe cmyk

简短版:有什么简单的方法可以确定在Delphi XE中JPG文件是CMYK还是RGB?最好没有任何额外的库...

更长的版本:我有一个接受JPEG的第三方库。但无论出于何种原因,图书馆需要知道它们是否处于CMYK或RGB色彩空间。更糟糕的是,它会使CMYK的颜色错误(可能与CMS有关......)。 Delphi本身(TJPEGImage)正确显示CMYK图像,但似乎所有“CMYK vs RGB内容”都隐藏在jpeg.pas实现部分中,并且未发布...

我在互联网上搜索了很多东西,但在这里我发现只有几年的帖子。我也发现了Gabriel Corneanu修改过的jpeg.dcu,但它完全是为了让Delphi正确加载图像。而且似乎XE确实正确加载了CMYK JPEG。

最后我更倾向于将CMYK图像转换为RGB,即使它听起来很可怕,我也不介意通过重新编码JPEG来实现它(如果没有其他更好的选择)。基本上将其加载到位图并在需要时将位图保存为JPEG ...

P.S。我想尽可能避免将另一个库带到我的项目中,并且我希望尽可能地保持在“标准Delphi”中,所以如果我需要将这个项目移动到Mac,iOS或Android我不需要处理很多外部事情......

2 个答案:

答案 0 :(得分:1)

几乎可以在几乎所有时间工作的简单方法是在图像中搜索SOF(帧开始)标记。
如果该标记具有1个分量,则图像为灰度;如果它有3个组件,它很可能是YCbCr;如果它有4个组件,则很可能是CMYK。

如果您想要更可靠的方法,则需要识别JPEG文件格式。为此,您将阅读APPn标记。从那里开始,处理将取决于找到的文件类型。

答案 1 :(得分:1)

我们已将解决方案缩小为三个:

  • 自己解析JPEG - 这似乎有风险
  • 稍微修改Delphi的jpeg.pas(更改类的名称并公开CMYK信息) - 这似乎是可行的选项,但我们不确定它是否版权好并且jpeg.pas大量使用很多OBJ在未来可能在其他平台上无法使用
  • 使用第三方库,我们找到了NativeJPG http://www.simdesign.nl/nativejpg.html,它似乎做得很好,应该用纯Pascal编写,所以我们认为它很有可能会如果需要,可以轻松移植到其他平台。