【发布时间】:2012-02-13 11:41:24
【问题描述】:
Delphi 似乎不喜欢一些 Jpg 图像。我正在加载的文件似乎是特定的。过程很简单 - a) 将 Jpg 图像加载到 TJpegImage,b) 将 Jpg 对象分配给 TBitmap 对象,以及 c) 保存和/或显示 Bmp 图像。出于某种原因,这些图片总是带有蓝色调。
这些图像在我加载它们的任何地方和任何地方都能完美显示(Windows 图片查看器、绘画、photoshop 等)。
而我做的事情很简单……
procedure Load;
var
J: TJpegImage;
B: TBitmap;
begin
J:= TJpegImage.Create;
B:= TBitmap.Create;
J.LoadFromFile('C:\SomeFile.jpg');
B.Assign(J);
//Either save or display `B` and it appears blueish at this point
....
我想尽可能避免获得任何第三方的东西。 Delphi 版本 7、2010 和 XE2 中存在此问题。至少 XE2 中的 TImage 控件可以正确显示它(而不是旧的两个),但是如果 TBitmap 仍然不起作用,这并不重要。这个文件有什么问题?和/或,Delphi 的渲染有什么问题?
添加信息
我最近发现了一些关于这些图片的信息。当它们来自供应商(产品图片)时,它们是 CMYK 格式。当时,Delphi 7 没有正确支持这些文件(访问冲突和坏图像),因此所有图片都通过转换器过滤为 RGB 颜色格式。许多原始图像也是 TIFF 并转换为 JPG。所以看来FastStone Image Resizer软件在通过时一定不能正确保存这些文件。蓝色图像不会出现在所有人身上,只是一次随机出现一些批次。该软件处理数千种产品,因此有数千种可能的图片。
【问题讨论】:
-
这似乎是 Delphi JPEG 解码器实现的一个错误,过去我也遇到了一些 jpeg 图像的另一个问题。我的建议是使用特定于 jpeg 图像的组件,例如
NativeJpg v.1.30 -
@CosminPrund FWIW ImageMagick 是为此选择的工具。这是命令行中的单行代码:
for /f %f in (*.jpg) do @convert %f %~nf.bmp -
Delphi 无法检测所有类型的 JPG 图像(CYMK、RGB 是其中的 2 种),这会导致转换时出现错误的调色板。恐怕你会需要 RRUZ 的评论中的 NativeJPG 之类的东西
-
链接的图像是 JPG,没有使用 sRGB 颜色空间嵌入颜色配置文件,至少 Gimp 是这样告诉我的。如果这是真的,那是一个非常普通的 JPG 文件。它在 Delphi 中呈现蓝色而在 PictureViewer 中呈现绿色的事实告诉我 JPG 文件中有一个微妙的错误。我怀疑Delphi不支持实际格式,它更像是文件中有一个错误,其他解码器比Delphi恢复得更好。正因为如此,我不相信一个小的 JPG 解码器实现,不能保证它更健壮。我会寻找一个广泛传播的图书馆,仅此而已。
-
使用 D7 jpeg 时,不仅调色板,而且 32 位颜色深度也失败了。
标签: delphi image-processing graphics jpeg