GDI+ 能够打开某种格式的图像, 就会有对应的解码器; 能够保存为某种格式, 也会有对应的编码器.
下面程序通过 IGPImageCodecInfoArray 与 IGPImageCodecInfo 获取了 GDI+ 能够编码与解码的格式:
uses GdiPlus; procedure TForm1.Button1Click(Sender: TObject); var Encoders, Decoders: IGPImageCodecInfoArray; Encoder, Decoder: IGPImageCodecInfo; begin Memo1.Clear; Memo1.Lines.Add('可编码格式:'); Encoders := TGPImageCodecInfo.GetImageEncoders; for Encoder in Encoders do begin Memo1.Lines.Add(Encoder.FilenameExtension); end; Memo1.Lines.Add(EmptyStr); Memo1.Lines.Add('可解码格式:'); Decoders := TGPImageCodecInfo.GetImageDecoders; for Decoder in Decoders do begin Memo1.Lines.Add(Decoder.FilenameExtension); end; end; { 结果如下: 可编码格式: *.BMP;*.DIB;*.RLE *.JPG;*.JPEG;*.JPE;*.JFIF *.GIF *.TIF;*.TIFF *.PNG 可解码格式: *.BMP;*.DIB;*.RLE *.JPG;*.JPEG;*.JPE;*.JFIF *.GIF *.EMF *.WMF *.TIF;*.TIFF *.PNG *.ICO }
编码器(或解码器)的所有属性:
IGPImageCodecInfo.ClsId; { 统一的 GUID 标识 } IGPImageCodecInfo.CodecName; { 名称 } IGPImageCodecInfo.DllName; { } IGPImageCodecInfo.FilenameExtension; { 扩展名 } IGPImageCodecInfo.Flags; { 标志 } IGPImageCodecInfo.FormatDescription; { 格式描述 } IGPImageCodecInfo.FormatId; { 格式 ID } IGPImageCodecInfo.MimeType; { 类型 } IGPImageCodecInfo.Version; { 版本 }
可以通过 TGPImageFormat 方便获取指定类型的编码器的统一 GUID 标识:
uses GdiPlus; procedure TForm1.Button1Click(Sender: TObject); var E: IGPImageCodecInfo; begin with Memo1.Lines do begin Clear; { 通过 TGPImageCodecInfo 获取编码器的统一标识 } for E in TGPImageCodecInfo.GetImageEncoders do begin Add(Format('%s - %s', [GUIDToString(E.ClsId), E.FormatDescription])); end; Add(EmptyStr); { 通过 TGPImageFormat 获取指定格式的编码器的统一标识 } Add(Format('%s - BMP', [GUIDToString(TGPImageFormat.Bmp.CodecId)])); Add(Format('%s - JPEG', [GUIDToString(TGPImageFormat.Jpeg.CodecId)])); Add(Format('%s - GIF', [GUIDToString(TGPImageFormat.Gif.CodecId)])); Add(Format('%s - TIFF', [GUIDToString(TGPImageFormat.Tiff.CodecId)])); Add(Format('%s - PNG', [GUIDToString(TGPImageFormat.Png.CodecId)])); end; end; (* 结果是一样的: {557CF400-1A04-11D3-9A73-0000F81EF32E} - BMP {557CF401-1A04-11D3-9A73-0000F81EF32E} - JPEG {557CF402-1A04-11D3-9A73-0000F81EF32E} - GIF {557CF405-1A04-11D3-9A73-0000F81EF32E} - TIFF {557CF406-1A04-11D3-9A73-0000F81EF32E} - PNG {557CF400-1A04-11D3-9A73-0000F81EF32E} - BMP {557CF401-1A04-11D3-9A73-0000F81EF32E} - JPEG {557CF402-1A04-11D3-9A73-0000F81EF32E} - GIF {557CF405-1A04-11D3-9A73-0000F81EF32E} - TIFF {557CF406-1A04-11D3-9A73-0000F81EF32E} - PNG *)
下面是把一个图像文件分别保存(或叫编码)为其他格式的例子:
uses GdiPlus; procedure TForm1.Button1Click(Sender: TObject); var Image: IGPImage; begin ChDir('C:\GdiPlusImg\'); Image := TGPImage.Create('Bird.bmp'); Image.Save('Bird_Jpeg.jpg', TGPImageFormat.Jpeg); Image.Save('Bird_Gif.gif', TGPImageFormat.Gif); Image.Save('Bird_Tiff.tif', TGPImageFormat.Tiff); Image.Save('Bird_Png.png', TGPImageFormat.Png); Image.Save('Bird_Bmp.bmp', TGPImageFormat.Bmp); end;
图像编码时还有一些参数, 譬如保存不同质量的 jpg(压缩级别).
分类:
Delphi 与 GDI+
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
2008-12-29 关于 TStringList.Assign - 回复 "u9cm" 的问题
2008-12-29 C# 语法练习(2): 字符转义
2008-12-29 C# 语法练习(1): 基本数据类型
2008-12-29 重写了博客上的代码着色脚本
2007-12-29 测试 TList