在Delphi7中处理CMYK jpeg文件

在Delphi7中处理CMYK jpeg文件,delphi,delphi-7,Delphi,Delphi 7,我正在尝试访问存储为Jpeg文件的文件,是否有一种简单的方法可以在不损失性能的情况下显示这些图像文件?您可以使用TJPEGImage实例加载Jpeg文件,然后将其分配给TBitmap以显示。您可以在单位jpeg中找到TJPEG图像 jpeg := TJPEGImage.Create; jpeg.LoadFromFile('filename.jpg'); bitm := TBitmap.Create; bitm.Assign(jpeg); Image1.Height := bitm.Heigh

我正在尝试访问存储为Jpeg文件的文件,是否有一种简单的方法可以在不损失性能的情况下显示这些图像文件?

您可以使用TJPEGImage实例加载Jpeg文件,然后将其分配给TBitmap以显示。您可以在单位jpeg中找到TJPEG图像

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);

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

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);

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


如果使用RPEH发布的JPEG单元无法打开它,您可能会考虑使用GDI+之类的东西来加载图形文件。

< P>我不相信D7可以处理CMYK JPEG的

如果使用RPEH发布的JPEG单元无法打开它,您可能会考虑使用GDI+之类的东西来加载图形文件。

实际上,我曾经修改JPEGPAS单元到部分CMYK支持。基本上

jpeg_start_decompress(jc.d) 
你应该检查一下

if jc.d.out_color_space = JCS_CMYK then
如果在jpeg\u read\u扫描行之后为true,则将获得4字节的数据,而不是3字节的数据

此外,cinfo.saw_Adobe_标记表示反向值。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);

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

jpeg_start_decompress(jc.d) 
你应该检查一下

if jc.d.out_color_space = JCS_CMYK then
如果在jpeg\u read\u扫描行之后为true,则将获得4字节的数据,而不是3字节的数据

此外,cinfo.saw_Adobe_标记表示反向值。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);
我找到了这一页

增强的jpeg实现

作者:加布里埃尔·科纳努

本单元包含一个基于Delphi原版的新jpeg实现

修复了访问一像素高图片的错误 添加了基于Thomas G.Lane C库的jpeg图像无损转换支持-访问 添加了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) } 
);
过程Cropxoffs、yoffs、newwidth、newheight:整数;此方法正在裁剪图像

程序转换操作:TJpegTransform;此方法正在应用指定的转换;阅读transupp.h关于限制的评论。我的代码正在使用裁剪选项

属性IsCMYK:布尔读取FIsCMYK;这将指示最后加载的jpeg图像是否为CMYK编码

属性InverseCMYK:布尔读取FInverseCMYK写入SetInverseCMYK;如果设置为默认值,因为我只能找到这类图像,CMYK图像将使用反转的CMYK值进行解码,我读到Photoshop正在这样做

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

将意见发送至: 加布里埃尔:我找到了这个页面

增强的jpeg实现

作者:加布里埃尔·科纳努

本单元包含一个基于Delphi原版的新jpeg实现

修复了访问一像素高图片的错误 添加了基于Thomas G.Lane C库的jpeg图像无损转换支持-访问 添加了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) } 
);
过程Cropxoffs、yoffs、newwidth、newheight:整数;这种方法是不正确的 电子图像

程序转换操作:TJpegTransform;此方法正在应用指定的转换;阅读transupp.h关于限制的评论。我的代码正在使用裁剪选项

属性IsCMYK:布尔读取FIsCMYK;这将指示最后加载的jpeg图像是否为CMYK编码

属性InverseCMYK:布尔读取FInverseCMYK写入SetInverseCMYK;如果设置为默认值,因为我只能找到这类图像,CMYK图像将使用反转的CMYK值进行解码,我读到Photoshop正在这样做

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

将意见发送至: 加布里埃尔:轻松

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

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

在这里获取: 轻松

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

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

在这里获取:

只需将jpeg单元包含在您的使用中,以便该单元自行注册,然后使用Image1.Picture.LoadFromFile'c:\filename.jpg';。Image1是放置在表单上的图像。TJPEGImage无法处理CMYK JPEG图像,您可能希望获得类似NativeJPEG的图像。有一种称为AutoMyktorGB的图像,有人知道它是如何工作的吗?也许这就是解决方案。。我今天使用Delphi 7,但有一天我计划升级,但是它有我以前尝试过的jpegex单元,但是速度很慢,但是这个版本可能会被修改,我会给它一个机会,只要在您的使用中包含jpeg单元,使单元注册自己,然后使用Image1.Picture.LoadFromFile'c:\filename.jpg';。Image1是放置在表单上的图像。TJPEGImage无法处理CMYK JPEG图像,您可能希望获得类似NativeJPEG的图像。有一种称为AutoMyktorGB的图像,有人知道它是如何工作的吗?也许这就是解决方案。。我今天使用Delphi 7,但有一天我计划升级,但是它有jpegex单元,我以前试过,但是速度很慢,但是这个版本可能会被修改,我会让它很有趣,但是,我换上了新的Delphi XE,它似乎能够处理CMYK JPEG:太好了,它对我来说很有用。只需将文件放入您的项目source.interresting,但是,我使用了新的delphi XE,它似乎能够处理CMYK JPEG:太好了,它对我很有用。只要把你的项目源文件。我需要它编译为D2007请或源代码。我需要它编译为D2007请或源代码。