• GdiPlus[49]: 图像(一) 概览



    三个主要的图像相关接口是: IGPImage、IGPBitmap、IGPMetafile.

    IGPBitmap、IGPMetafile 都是从 IGPImage 继承, 分别用于处理位图和图元文件.

    还有从 IGPBitmap 继承的 IGPCachedBitmap 用于快速呈现图像.

    IGPImage 的方法与属性:
    //方法
    IGPImage.Clone;                     { 克隆 }
    IGPImage.Save();                    { 按指定格式保存到文件或流 }
    IGPImage.SaveAdd();                 { 给许可多页的图像添加页 }
    IGPImage.GetPhysicalDimension();    { 获取图像的大小(宽、高) }
    IGPImage.GetBounds();               { 以指定单位获取图像的边界矩形 }
    IGPImage.GetThumbnailImage();       { 获取缩略图 }
    IGPImage.GetFrameDimensions;        { 获取一个 GUID 数组, 每个 GUID 代表一帧 }
    IGPImage.GetFrameCount();           { 获取帧数 }
    IGPImage.SelectActiveFrame();       { 选择指定索引的帧为当前帧 }
    IGPImage.RotateFlip();              { 旋转图像 }
    IGPImage.GetPropertyItem();         { 获取属性项 }
    IGPImage.SetPropertyItem();         { 设置属性项 }
    IGPImage.RemovePropertyItem();      { 删除属性项 }
    IGPImage.GetEncoderParameterList(); { 获取图像编码器支持的参数信息 }
    
    //属性
    IGPImage.ImageType;            { 图像类型(Bitmap/Metafile/Unknown) }
    IGPImage.Width;                { 宽度(单位是像素) }
    IGPImage.Height;               { 高度(单位是像素) }
    IGPImage.HorizontalResolution; { 获取水平分辨率(以"像素/英寸"为单位) }
    IGPImage.VerticalResolution;   { 获取垂直分辨率(以"像素/英寸"为单位) }
    IGPImage.Flags;                { 获取图像像素的属性标志 }
    IGPImage.RawFormat;            { 获取图像的文件格式 }
    IGPImage.PixelFormat;          { 获取图像的像素格式 }
    IGPImage.Palette;              { 获取或设置调色板 }
    IGPImage.PropertyIdList;       { 获取图像属性 ID 数组 }
    IGPImage.PropertyItems;        { 获取图像属性集合 }
    

    IGPBitmap 在 IGPImage 的基础上添加的方法与属性:
    //方法
    IGPBitmap.GetHBitmap();    { 创建 GDI 格式的 Bitmap 并返回句柄 }
    IGPBitmap.GetHIcon;        { 创建 Icon 文件并返回句柄 }
    IGPBitmap.LockBits();      { 锁定对象中内存中的像素数据 }
    IGPBitmap.UnlockBits();    { 解除 LockBits 的锁定 }
    IGPBitmap.SetResolution(); { 设置分辨率 }
    
    //属性
    IGPBitmap.Pixels;          { 获取或设置指定像素的颜色 }
    

    IGPMetafile 在 IGPImage 的基础上添加的方法与属性:
    //方法
    IGPMetafile.GetMetafileHeader; { 获取 Metafile 的 MetafileHeader }
    IGPMetafile.GetHEnhMetafile;   { 获取增强型 Metafile 的 Windows 句柄 }
    IGPMetafile.PlayRecord();      { 播放单个图元文件记录 }
    
    //属性
    IGPMetafile.DownLevelRasterizationLimit; {  }
    

    还有几个图像相关的公共内联函数:
    function GetPixelFormatSize();     { 返回指定像素格式的颜色深度(每个像素的位数) }
    function IsIndexedPixelFormat();   { 判断像素格式是否是索引的 }
    function IsAlphaPixelFormat();     { 判断像素格式是否包含 alpha 信息 }
    function IsCanonicalPixelFormat(); { 像素格式是否是每个像素 32 位(标准) }
    function IsExtendedPixelFormat();  { 像素格式是否是每个像素 64 位 }
    

    另外还有 IGPImageAttributes 等多个辅助接口.

    上面提到过的 IGPCachedBitmap 没有自己独有的方法和属性, 下面的例子是它和 IGPBitmap 的对比测试:

    //测试结果是 CachedBitmap 比 Bitmap 快 3 倍左右.
    uses GdiPlus;
    
    procedure TForm1.Button1Click(Sender: TObject);
    const
      count = 1000;
    var
      Graphic: IGPGraphics;
      Bitmap: IGPBitmap;
      CachedBitmap: IGPCachedBitmap;
      t1,t2,x,y: Cardinal;
      i: Integer;
    begin
      Graphic := TGPGraphics.Create(Handle);
      Bitmap := TGPBitmap.Create('C:\GdiPlusImg\Texture.jpg');
      CachedBitmap := TGPCachedBitmap.Create(Bitmap, Graphic);
      x := ClientWidth - Bitmap.Width;
      y := ClientHeight - Bitmap.Height;
    
      t1 := GetTickCount;
      for i := 0 to count - 1 do
        Graphic.DrawImage(Bitmap, Random(x), Random(y));
      t1 := GetTickCount - t1;
    
      t2 := GetTickCount;
      for i := 0 to count - 1 do
        Graphic.DrawCachedBitmap(CachedBitmap, Random(x), Random(y));
      t2 := GetTickCount - t2;
    
      Text := Format('%d : %d', [t1, t2]);
    end;
    
  • 相关阅读:
    题解 CF36B【Fractal】
    21清北学堂腾飞营游记
    canvas小试牛刀
    ES度量聚合(ElasticSearch Metric Aggregations)总结
    Mybatis中设计模式的运用
    Mybatis源码-SqlSession(二)
    Mybatis源码-sqlSessionFactory(一)
    Redis6.0多线程模型总结
    RocketMQ中的CommitLog、ConsumeQueue、indexFile、offsetTable以及多种偏移量对比
    SpringBoot——自动配置原理
  • 原文地址:https://www.cnblogs.com/del/p/1632409.html
Copyright © 2020-2023  润新知