GdiPlus[54]: 图像(六) 图像解码与编码


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

你可能感兴趣的:(dip)