在Delphi 7中处理CMYK jpeg文件

时间:2010-06-29 18:18:32

标签: delphi delphi-7

我正在尝试访问存储为Jpeg文件的文件,是否有一种简单的方法来显示这些图像文件而不会丢失性能?

5 个答案:

答案 0 :(得分:2)

您可以使用TJPEGImage实例加载JPeg文件,然后将其分配给要显示的TBitmap。你可以在单位jpeg中找到TJPEGImage。

jpeg := TJPEGImage.Create;
jpeg.LoadFromFile('filename.jpg');
bitm := TBitmap.Create;
bitm.Assign(jpeg); 

Image1.Height := bitm.Height;
Image1.Width := bitm.Width;
Image1.Canvas.Draw(0, 0, bitm);

或者,这也应该有效:

bitm := TBitmap.Create;
bitm.Assign('filename.jpg'); 

Image1.Height := bitm.Height;
Image1.Width := bitm.Width;
Image1.Canvas.Draw(0, 0, bitm);

答案 1 :(得分:2)

我找到了这个页面!

<强> http://cc.embarcadero.com/Item/19723

增强的jpeg实现

作者:Gabriel Corneanu

此单元包含一个新的jpeg实现(基于Delphi原创)

  • 修复了访问一个像素高度图片的错误
  • 为jpeg图像添加了无损转换支持(基于Thomas G. Lane C库 - 访问jpegclub.org/jpegtran
  • 添加了CMYK支持(只读)
  • 编译为D5-2010和BCB5-6-CMYK转换为RGB快速MMX转换(不适用于Delphi5,缺少MMX ASM)(如果不可用,则回退到简单的pascal实现)
  • 修复了Delphi 5 ASM中的错误(CMYK到RGB功能)

你只需要jpeg.dcu文件;它可以复制到程序目录或LIB目录。我生成了obj和hpp文件,也可以用于CBuilder 5和6.这就是你需要使用它:

这只是一个枚举

TJpegTransform = ( 
     jt_FLIP_H,     { horizontal flip }
     jt_FLIP_V,     { vertical flip }
     jt_TRANSPOSE,  { transpose across UL-to-LR axis } 
     jt_TRANSVERSE, { transpose across UR-to-LL axis } 
     jt_ROT_90,     { 90-degree clockwise rotation } 
     jt_ROT_180,    { 180-degree rotation } 
     jt_ROT_270     { 270-degree clockwise (or 90 ccw) } 
);

procedure Crop(xoffs, yoffs, newwidth, newheight: integer);此方法正在裁剪图像

procedure Transform(Operation: TJpegTransform);此方法正在应用指定的转换;阅读transupp.h关于限制的评论(我的代码使用裁剪选项)

property IsCMYK: boolean read FIsCMYK;这将指示加载的最后一个jpeg图像是否为CMYK编码

property InverseCMYK: boolean read FInverseCMYK write SetInverseCMYK;如果设置(默认,因为我只能找到这种图像),CMYK图像会被反转的CMYK值解码(我读过Photoshop正在这样做)。

jpegex是使用不同名称编译的相同单元。如果没有源代码链接到原始jpeg单元的其他组件,它可用于避免冲突。在这种情况下,您可能需要使用限定类名来解决名称冲突:jpegex.TJpegImage.xxx。在一个程序中使用两个版本时要小心:即使类具有相同的名称,它们也不相同,您无法直接转换或分配它们。交换数据的唯一方法是从流中保存到/加载。

发送评论至: gabrielcorneanuATyahooDOTcom

答案 2 :(得分:1)

我不相信D7可以处理 CMYK JPEG。

如果您无法像Ralph发布的那样使用JPEG单位打开它,您可以考虑使用类似GDI +的内容来加载图形文件。

答案 3 :(得分:1)

实际上,我曾经将Jpeg.pas单位修改为部分CMYK支持。基本上是在

之后
jpeg_start_decompress(jc.d) 

你应该检查

if jc.d.out_color_space = JCS_CMYK then

如果在jpeg_read_scanlines之后为true,则将获得4个字节的数据而不是3个字节。

cinfo.saw_Adobe_marker也表示反转值(可能Adobe是第一个引入CMYK jpeg变化的人)。

但最困难的部分是CMYK-RGB转换。由于没有通用的公式,在最好的系统中,它始终是表格方法。我试图找到一些简单的近似值,但总有一张图片不合适。仅作为示例,不要将此公式用作参考:

 R_:=Max(254 - (111*C +  2*M  +  7*Y  + 36*K) div 128, 0);
 G_:=Max(254 - (30*C  + 87*M  + 15*Y  + 30*K) div 128, 0);
 B_:=Max(254 - (15*C  + 44*M  + 80*Y  + 24*K) div 128, 0);

答案 4 :(得分:1)

容易!

我在JPEG.PAS中实现了CMYK转换

将其包含在您的项目中以处理CMYK JPEG的

在此处获取: http://delphi.andreotti.nl/