zoukankan      html  css  js  c++  java
  • GdiPlus[58]: 图像(十) IGPMetafile 特有的属性与方法


    这包括:
    //方法
    IGPMetafile.GetMetafileHeader; { 获取 Metafile 的 MetafileHeader }
    IGPMetafile.GetHEnhMetafile;   { 获取增强型 Metafile 的 Windows 句柄 }
    IGPMetafile.PlayRecord();      { 播放单个图元文件记录 }
    
    //属性
    IGPMetafile.DownLevelRasterizationLimit; { 好像是控制纹理画刷的分辨率用的; 赋于 0 时则使用默认值. }
    
    //还有
    IGPGraphics.AddMetafileComment();     { 向当前 Metafile 添加注释 }
    IGPGraphics.EnumerateMetafile();      { 枚举 Metafile 中的图形命令 }
    

    IGPMetafile.GetMetafileHeader 获取文件信息, 得到一个 TGPMetafileHeader 结构对象:
    TGPMetafileHeader.IsWmf;             { 是否是 Wmf 格式 }
    TGPMetafileHeader.IsEmf;             { 是否是 Emf 格式 }
    TGPMetafileHeader.IsEmfPlus;         { 是否是 Emf+ 格式 }
    TGPMetafileHeader.IsEmfOrEmfPlus;    { 是否是 Emf 或 Emf+ 格式 }
    TGPMetafileHeader.IsEmfPlusDual;     { 是否是 "双重" 增强型图元文件格式, 它同时支持 Emf 和 Emf+ }
    TGPMetafileHeader.IsWmfPlaceable;    { 能否放置 Wmf }
    TGPMetafileHeader.IsEmfPlusOnly;     { 是否只支持 Emf+ }
    TGPMetafileHeader.IsDisplay;         { 是否与设备相关 }
    
    TGPMetafileHeader.MetafileType;      { 类型 }
    TGPMetafileHeader.MetafileSize;      { 大小; 以字节为单位 }
    TGPMetafileHeader.Version;           { 版本号 }
    TGPMetafileHeader.Bounds;            { 边界矩形 }
    TGPMetafileHeader.DpiX;              { 水平分辨率; 以每英寸点数为单位 }
    TGPMetafileHeader.DpiY;              { 垂直分辨率; 以每英寸点数为单位 }
    TGPMetafileHeader.LogicalDpiX;       { 逻辑水平分辨率; 以每英寸点数为单位 }
    TGPMetafileHeader.LogicalDpiY;       { 逻辑垂直分辨率; 以每英寸点数为单位 }
    TGPMetafileHeader.EmfPlusFlags;      { Emf+ 标志 }
    TGPMetafileHeader.WmfHeader;         { 获取 Wmf 文件头 }
    TGPMetafileHeader.EmfHeader;         { 获取 Emf 文件头 }
    TGPMetafileHeader.EmfPlusHeaderSize; { 获取 EmfHeader 的大小 }
    

    简单显示(或叫回放)图元文件:

    uses GdiPlus;
    
    procedure TForm1.FormPaint(Sender: TObject);
    var
      Metafile: IGPMetafile;
      Graphics: IGPGraphics;
      Pt: TGPPointF;
    begin
      Metafile := TGPMetafile.Create('C:\GdiPlusImg\SampleMetafile.emf');
      Graphics := TGPGraphics.Create(Handle);
      Graphics.DrawImage(Metafile, 10, 10);
    end;
    

    使用回调函数回放图元文件之一:

    uses GdiPlus;
    
    var Metafile: IGPMetafile;
    
    function MetafileProc(RecordType: TEmfPlusRecordType; Flags, DataSize: UINT;
      Data: PByte; CallbackData: Pointer): BOOL; stdcall;
    begin
      Metafile.PlayRecord(RecordType, Flags, DataSize, Data);
      Result := True;
    end;
    
    procedure TForm1.FormPaint(Sender: TObject);
    var
    //  Metafile: IGPMetafile;
      Graphics: IGPGraphics;
      Pt: TGPPointF;
    begin
      Metafile := TGPMetafile.Create('C:\GdiPlusImg\SampleMetafile.emf');
      Graphics := TGPGraphics.Create(Handle);
      Pt.Initialize(10, 10);
      Graphics.EnumerateMetafile(Metafile, Pt, MetafileProc);
    end;
    

    使用回调函数回放图元文件之二(不使用全局变量):

    uses GdiPlus;
    
    function MetafileProc(RecordType: TEmfPlusRecordType; Flags, DataSize: UINT;
      Data: PByte; CallbackData: Pointer): BOOL; stdcall;
    begin
      IGPMetafile(CallbackData).PlayRecord(RecordType, Flags, DataSize, Data);
      Result := True;
    end;
    
    procedure TForm1.FormPaint(Sender: TObject);
    var
      Metafile: IGPMetafile;
      Graphics: IGPGraphics;
      Pt: TGPPointF;
    begin
      Metafile := TGPMetafile.Create('C:\GdiPlusImg\SampleMetafile.emf');
      Graphics := TGPGraphics.Create(Handle);
      Pt.Initialize(10, 10);
      Graphics.EnumerateMetafile(Metafile, Pt, MetafileProc, Pointer(Metafile));
    end;
    

    获取图元文件中命令总数:

    uses GdiPlus;
    
    var Metafile: IGPMetafile;
    
    function MetafileProc(RecordType: TEmfPlusRecordType; Flags, DataSize: UINT;
      Data: PByte; CallbackData: Pointer): BOOL; stdcall;
    begin
      Inc(PInteger(CallbackData)^);
      Result := True;
    end;
    
    procedure TForm1.FormPaint(Sender: TObject);
    var
      Graphics: IGPGraphics;
      n: Integer;
    begin
      Metafile := TGPMetafile.Create('C:\GdiPlusImg\SampleMetafile.emf');
      Graphics := TGPGraphics.Create(Handle);
      n := 0;
      Graphics.EnumerateMetafile(Metafile, TGPPointF.Create(10,10), MetafileProc, @n);
      Text := IntToStr(n); { 13 }
    end;
    
    获取图元文件的命令类型列表:

    uses GdiPlus;
    
    var
      Metafile: IGPMetafile;
      List: TStrings;
    
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      List := TStringList.Create;
      List.CommaText :=
        '66058=WmfRecordTypeSetTextJustification,'+
        '66059=WmfRecordTypeSetWindowOrg,'+
        '66060=WmfRecordTypeSetWindowExt,'+
        '66061=WmfRecordTypeSetViewportOrg,'+
        '66062=WmfRecordTypeSetViewportExt,'+
        '66063=WmfRecordTypeOffsetWindowOrg,'+
        '66576=WmfRecordTypeScaleWindowExt,'+
        '66065=WmfRecordTypeOffsetViewportOrg,'+
        '66578=WmfRecordTypeScaleViewportExt,'+
        '66067=WmfRecordTypeLineTo,'+
        '66068=WmfRecordTypeMoveTo,'+
        '66581=WmfRecordTypeExcludeClipRect,'+
        '66582=WmfRecordTypeIntersectClipRect,'+
        '67607=WmfRecordTypeArc,'+
        '66584=WmfRecordTypeEllipse,'+
        '66585=WmfRecordTypeFloodFill,'+
        '67610=WmfRecordTypePie,'+
        '66587=WmfRecordTypeRectangle,'+
        '67100=WmfRecordTypeRoundRect,'+
        '67101=WmfRecordTypePatBlt,'+
        '65566=WmfRecordTypeSaveDC,'+
        '66591=WmfRecordTypeSetPixel,'+
        '66080=WmfRecordTypeOffsetClipRgn,'+
        '66849=WmfRecordTypeTextOut,'+
        '67874=WmfRecordTypeBitBlt,'+
        '68387=WmfRecordTypeStretchBlt,'+
        '66340=WmfRecordTypePolygon,'+
        '66341=WmfRecordTypePolyline,'+
        '67110=WmfRecordTypeEscape,'+
        '65831=WmfRecordTypeRestoreDC,'+
        '66088=WmfRecordTypeFillRegion,'+
        '66601=WmfRecordTypeFrameRegion,'+
        '65834=WmfRecordTypeInvertRegion,'+
        '65835=WmfRecordTypePaintRegion,'+
        '65836=WmfRecordTypeSelectClipRegion,'+
        '65837=WmfRecordTypeSelectObject,'+
        '65838=WmfRecordTypeSetTextAlign,'+
        '67119=WmfRecordTypeDrawText,'+
        '67632=WmfRecordTypeChord,'+
        '66097=WmfRecordTypeSetMapperFlags,'+
        '68146=WmfRecordTypeExtTextOut,'+
        '68915=WmfRecordTypeSetDIBToDev,'+
        '66100=WmfRecordTypeSelectPalette,'+
        '65589=WmfRecordTypeRealizePalette,'+
        '66614=WmfRecordTypeAnimatePalette,'+
        '65591=WmfRecordTypeSetPalEntries,'+
        '66872=WmfRecordTypePolyPolygon,'+
        '65849=WmfRecordTypeResizePalette,'+
        '67904=WmfRecordTypeDIBBitBlt,'+
        '68417=WmfRecordTypeDIBStretchBlt,'+
        '65858=WmfRecordTypeDIBCreatePatternBrush,'+
        '69443=WmfRecordTypeStretchDIB,'+
        '66888=WmfRecordTypeExtFloodFill,'+
        '65865=WmfRecordTypeSetLayout,'+
        '65868=WmfRecordTypeResetDC,'+
        '65869=WmfRecordTypeStartDoc,'+
        '65615=WmfRecordTypeStartPage,'+
        '65616=WmfRecordTypeEndPage,'+
        '65618=WmfRecordTypeAbortDoc,'+
        '65630=WmfRecordTypeEndDoc,'+
        '66032=WmfRecordTypeDeleteObject,'+
        '65783=WmfRecordTypeCreatePalette,'+
        '65784=WmfRecordTypeCreateBrush,'+
        '66041=WmfRecordTypeCreatePatternBrush,'+
        '66298=WmfRecordTypeCreatePenIndirect,'+
        '66299=WmfRecordTypeCreateFontIndirect,'+
        '66300=WmfRecordTypeCreateBrushIndirect,'+
        '66301=WmfRecordTypeCreateBitmapIndirect,'+
        '67326=WmfRecordTypeCreateBitmap,'+
        '67327=WmfRecordTypeCreateRegion,'+
        '1=EmfRecordTypeHeader,'+
        '2=EmfRecordTypePolyBezier,'+
        '3=EmfRecordTypePolygon,'+
        '4=EmfRecordTypePolyline,'+
        '5=EmfRecordTypePolyBezierTo,'+
        '6=EmfRecordTypePolyLineTo,'+
        '7=EmfRecordTypePolyPolyline,'+
        '8=EmfRecordTypePolyPolygon,'+
        '9=EmfRecordTypeSetWindowExtEx,'+
        '10=EmfRecordTypeSetWindowOrgEx,'+
        '11=EmfRecordTypeSetViewportExtEx,'+
        '12=EmfRecordTypeSetViewportOrgEx,'+
        '13=EmfRecordTypeSetBrushOrgEx,'+
        '14=EmfRecordTypeEOF,'+
        '15=EmfRecordTypeSetPixelV,'+
        '16=EmfRecordTypeSetMapperFlags,'+
        '17=EmfRecordTypeSetMapMode,'+
        '18=EmfRecordTypeSetBkMode,'+
        '19=EmfRecordTypeSetPolyFillMode,'+
        '20=EmfRecordTypeSetROP2,'+
        '21=EmfRecordTypeSetStretchBltMode,'+
        '22=EmfRecordTypeSetTextAlign,'+
        '23=EmfRecordTypeSetColorAdjustment,'+
        '24=EmfRecordTypeSetTextColor,'+
        '25=EmfRecordTypeSetBkColor,'+
        '26=EmfRecordTypeOffsetClipRgn,'+
        '27=EmfRecordTypeMoveToEx,'+
        '28=EmfRecordTypeSetMetaRgn,'+
        '29=EmfRecordTypeExcludeClipRect,'+
        '30=EmfRecordTypeIntersectClipRect,'+
        '31=EmfRecordTypeScaleViewportExtEx,'+
        '32=EmfRecordTypeScaleWindowExtEx,'+
        '33=EmfRecordTypeSaveDC,'+
        '34=EmfRecordTypeRestoreDC,'+
        '35=EmfRecordTypeSetWorldTransform,'+
        '36=EmfRecordTypeModifyWorldTransform,'+
        '37=EmfRecordTypeSelectObject,'+
        '38=EmfRecordTypeCreatePen,'+
        '39=EmfRecordTypeCreateBrushIndirect,'+
        '40=EmfRecordTypeDeleteObject,'+
        '41=EmfRecordTypeAngleArc,'+
        '42=EmfRecordTypeEllipse,'+
        '43=EmfRecordTypeRectangle,'+
        '44=EmfRecordTypeRoundRect,'+
        '45=EmfRecordTypeArc,'+
        '46=EmfRecordTypeChord,'+
        '47=EmfRecordTypePie,'+
        '48=EmfRecordTypeSelectPalette,'+
        '49=EmfRecordTypeCreatePalette,'+
        '50=EmfRecordTypeSetPaletteEntries,'+
        '51=EmfRecordTypeResizePalette,'+
        '52=EmfRecordTypeRealizePalette,'+
        '53=EmfRecordTypeExtFloodFill,'+
        '54=EmfRecordTypeLineTo,'+
        '55=EmfRecordTypeArcTo,'+
        '56=EmfRecordTypePolyDraw,'+
        '57=EmfRecordTypeSetArcDirection,'+
        '58=EmfRecordTypeSetMiterLimit,'+
        '59=EmfRecordTypeBeginPath,'+
        '60=EmfRecordTypeEndPath,'+
        '61=EmfRecordTypeCloseFigure,'+
        '62=EmfRecordTypeFillPath,'+
        '63=EmfRecordTypeStrokeAndFillPath,'+
        '64=EmfRecordTypeStrokePath,'+
        '65=EmfRecordTypeFlattenPath,'+
        '66=EmfRecordTypeWidenPath,'+
        '67=EmfRecordTypeSelectClipPath,'+
        '68=EmfRecordTypeAbortPath,'+
        '69=EmfRecordTypeReserved_069,'+
        '70=EmfRecordTypeGdiComment,'+
        '71=EmfRecordTypeFillRgn,'+
        '72=EmfRecordTypeFrameRgn,'+
        '73=EmfRecordTypeInvertRgn,'+
        '74=EmfRecordTypePaintRgn,'+
        '75=EmfRecordTypeExtSelectClipRgn,'+
        '76=EmfRecordTypeBitBlt,'+
        '77=EmfRecordTypeStretchBlt,'+
        '78=EmfRecordTypeMaskBlt,'+
        '79=EmfRecordTypePlgBlt,'+
        '80=EmfRecordTypeSetDIBitsToDevice,'+
        '81=EmfRecordTypeStretchDIBits,'+
        '82=EmfRecordTypeExtCreateFontIndirect,'+
        '83=EmfRecordTypeExtTextOutA,'+
        '84=EmfRecordTypeExtTextOutW,'+
        '85=EmfRecordTypePolyBezier16,'+
        '86=EmfRecordTypePolygon16,'+
        '87=EmfRecordTypePolyline16,'+
        '88=EmfRecordTypePolyBezierTo16,'+
        '89=EmfRecordTypePolylineTo16,'+
        '90=EmfRecordTypePolyPolyline16,'+
        '91=EmfRecordTypePolyPolygon16,'+
        '92=EmfRecordTypePolyDraw16,'+
        '93=EmfRecordTypeCreateMonoBrush,'+
        '94=EmfRecordTypeCreateDIBPatternBrushPt,'+
        '95=EmfRecordTypeExtCreatePen,'+
        '96=EmfRecordTypePolyTextOutA,'+
        '97=EmfRecordTypePolyTextOutW,'+
        '98=EmfRecordTypeSetICMMode,'+
        '99=EmfRecordTypeCreateColorSpace,'+
        '100=EmfRecordTypeSetColorSpace,'+
        '101=EmfRecordTypeDeleteColorSpace,'+
        '102=EmfRecordTypeGLSRecord,'+
        '103=EmfRecordTypeGLSBoundedRecord,'+
        '104=EmfRecordTypePixelFormat,'+
        '105=EmfRecordTypeDrawEscape,'+
        '106=EmfRecordTypeExtEscape,'+
        '107=EmfRecordTypeStartDoc,'+
        '108=EmfRecordTypeSmallTextOut,'+
        '109=EmfRecordTypeForceUFIMapping,'+
        '110=EmfRecordTypeNamedEscape,'+
        '111=EmfRecordTypeColorCorrectPalette,'+
        '112=EmfRecordTypeSetICMProfileA,'+
        '113=EmfRecordTypeSetICMProfileW,'+
        '114=EmfRecordTypeAlphaBlend,'+
        '115=EmfRecordTypeSetLayout,'+
        '116=EmfRecordTypeTransparentBlt,'+
        '117=EmfRecordTypeReserved_117,'+
        '118=EmfRecordTypeGradientFill,'+
        '119=EmfRecordTypeSetLinkedUFIs,'+
        '120=EmfRecordTypeSetTextJustification,'+
        '121=EmfRecordTypeColorMatchToTargetW,'+
        '122=EmfRecordTypeCreateColorSpaceW,'+
        '16384=EmfPlusRecordTypeInvalid,'+
        '16385=EmfPlusRecordTypeHeader,'+
        '16386=EmfPlusRecordTypeEndOfFile,'+
        '16387=EmfPlusRecordTypeComment,'+
        '16388=EmfPlusRecordTypeGetDC,'+
        '16389=EmfPlusRecordTypeMultiFormatStart,'+
        '16390=EmfPlusRecordTypeMultiFormatSection,'+
        '16391=EmfPlusRecordTypeMultiFormatEnd,'+
        '16392=EmfPlusRecordTypeObject,'+
        '16393=EmfPlusRecordTypeClear,'+
        '16394=EmfPlusRecordTypeFillRects,'+
        '16395=EmfPlusRecordTypeDrawRects,'+
        '16396=EmfPlusRecordTypeFillPolygon,'+
        '16397=EmfPlusRecordTypeDrawLines,'+
        '16398=EmfPlusRecordTypeFillEllipse,'+
        '16399=EmfPlusRecordTypeDrawEllipse,'+
        '16400=EmfPlusRecordTypeFillPie,'+
        '16401=EmfPlusRecordTypeDrawPie,'+
        '16402=EmfPlusRecordTypeDrawArc,'+
        '16403=EmfPlusRecordTypeFillRegion,'+
        '16404=EmfPlusRecordTypeFillPath,'+
        '16405=EmfPlusRecordTypeDrawPath,'+
        '16406=EmfPlusRecordTypeFillClosedCurve,'+
        '16407=EmfPlusRecordTypeDrawClosedCurve,'+
        '16408=EmfPlusRecordTypeDrawCurve,'+
        '16409=EmfPlusRecordTypeDrawBeziers,'+
        '16410=EmfPlusRecordTypeDrawImage,'+
        '16411=EmfPlusRecordTypeDrawImagePoints,'+
        '16412=EmfPlusRecordTypeDrawString,'+
        '16413=EmfPlusRecordTypeSetRenderingOrigin,'+
        '16414=EmfPlusRecordTypeSetAntiAliasMode,'+
        '16415=EmfPlusRecordTypeSetTextRenderingHint,'+
        '16416=EmfPlusRecordTypeSetTextContrast,'+
        '16417=EmfPlusRecordTypeSetInterpolationMode,'+
        '16418=EmfPlusRecordTypeSetPixelOffsetMode,'+
        '16419=EmfPlusRecordTypeSetCompositingMode,'+
        '16420=EmfPlusRecordTypeSetCompositingQuality,'+
        '16421=EmfPlusRecordTypeSave,'+
        '16422=EmfPlusRecordTypeRestore,'+
        '16423=EmfPlusRecordTypeBeginContainer,'+
        '16424=EmfPlusRecordTypeBeginContainerNoParams,'+
        '16425=EmfPlusRecordTypeEndContainer,'+
        '16426=EmfPlusRecordTypeSetWorldTransform,'+
        '16427=EmfPlusRecordTypeResetWorldTransform,'+
        '16428=EmfPlusRecordTypeMultiplyWorldTransform,'+
        '16429=EmfPlusRecordTypeTranslateWorldTransform,'+
        '16430=EmfPlusRecordTypeScaleWorldTransform,'+
        '16431=EmfPlusRecordTypeRotateWorldTransform,'+
        '16432=EmfPlusRecordTypeSetPageTransform,'+
        '16433=EmfPlusRecordTypeResetClip,'+
        '16434=EmfPlusRecordTypeSetClipRect,'+
        '16435=EmfPlusRecordTypeSetClipPath,'+
        '16436=EmfPlusRecordTypeSetClipRegion,'+
        '16437=EmfPlusRecordTypeOffsetClip,'+
        '16438=EmfPlusRecordTypeDrawDriverString,'+
        '16439=EmfPlusRecordTypeStrokeFillPath,'+
        '16440=EmfPlusRecordTypeSerializableObject,'+
        '16441=EmfPlusRecordTypeSetTSGraphics,'+
        '16442=EmfPlusRecordTypeSetTSClip';
    end;
    
    function MetafileProc(RecordType: TEmfPlusRecordType; Flags, DataSize: UINT;
      Data: PByte; CallbackData: Pointer): BOOL; stdcall;
    begin
      PString(CallbackData)^ := PString(CallbackData)^ + List.Values[IntToStr(Ord(RecordType))] + #13#10;
      Result := True;
    end;
    
    procedure TForm1.FormPaint(Sender: TObject);
    var
      Graphics: IGPGraphics;
      str: string;
    begin
      Metafile := TGPMetafile.Create('C:\GdiPlusImg\SampleMetafile.emf');
      Graphics := TGPGraphics.Create(Handle);
      Graphics.EnumerateMetafile(Metafile, TGPPointF.Create(10,10), MetafileProc, @str);
      ShowMessage(str);
    { 结果:
      EmfRecordTypeHeader
      EmfPlusRecordTypeHeader
      EmfPlusRecordTypeObject
      EmfPlusRecordTypeDrawRects
      EmfPlusRecordTypeDrawEllipse
      EmfPlusRecordTypeSetAntiAliasMode
      EmfPlusRecordTypeDrawEllipse
      EmfPlusRecordTypeSetTextRenderingHint
      EmfPlusRecordTypeRotateWorldTransform
      EmfPlusRecordTypeObject
      EmfPlusRecordTypeDrawString
      EmfPlusRecordTypeEndOfFile
      EmfRecordTypeEOF
    }
    end;
    
    procedure TForm1.FormDestroy(Sender: TObject);
    begin
      List.Free;
    end;
    

    不回放其中的椭圆:

    uses GdiPlus;
    
    var Metafile: IGPMetafile;
    
    function MetafileProc(RecordType: TEmfPlusRecordType; Flags, DataSize: UINT;
      Data: PByte; CallbackData: Pointer): BOOL; stdcall;
    begin
      if RecordType <> EmfPlusRecordTypeDrawrEllipse then
      begin
        Metafile.PlayRecord(RecordType, Flags, DataSize, Data);
      end;
      Result := True;
    end;
    
    procedure TForm1.FormPaint(Sender: TObject);
    var
      Graphics: IGPGraphics;
    begin
      Metafile := TGPMetafile.Create('C:\GdiPlusImg\SampleMetafile.emf');
      Graphics := TGPGraphics.Create(Handle);
      Graphics.EnumerateMetafile(Metafile, TGPPointF.Create(10, 10), MetafileProc);
    end;
    
  • 相关阅读:
    完美解决ListView中事件ItemCreated中使用ClientID导致插入数据失败
    cookie 和session 的区别详解
    ref与out之间的区别整理
    showModalDialog介绍
    meta元素
    [转] Spring Boot特性
    [转] Spring Boot 揭秘与实战(二) 数据存储篇
    Jsch初步
    如何通俗的解释交叉熵与相对熵
    pip安装时的异常,找不到lib2to3\Grammar.txt
  • 原文地址:https://www.cnblogs.com/del/p/1637172.html
Copyright © 2011-2022 走看看