zoukankan      html  css  js  c++  java
  • 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(压缩级别).

  • 相关阅读:
    KVM -> 热迁移_05
    KVM -> 虚拟机磁盘管理_03
    使用光盘搭建本地yum源
    KVM -> 虚拟机管理&console登录_02
    使用windows-SQLyog连接linux-mysql
    linux下登陆mysql失败
    忘记root密码时如何重设密码
    批处理程序:自动登陆服务端,并循环执行某些命令
    linux--磁盘分区
    linux--档案与目录管理
  • 原文地址:https://www.cnblogs.com/del/p/1635186.html
Copyright © 2011-2022 走看看