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(压缩级别).