随笔 - 2146  文章 - 97 评论 - 11758 trackbacks - 253


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

posted on 2009-12-29 16:05 万一 阅读(...) 评论(...) 编辑 收藏