我正在尝试访问存储为Jpeg文件的文件,是否有一种简单的方法来显示这些图像文件而不会丢失性能?
答案 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.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)