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