• GdiPlus[53]: 图像(五) 图像的属性(图像元数据)



    相关方法和属性:
    IGPImage.GetPropertyItem();    { 获取属性项 }
    IGPImage.SetPropertyItem();    { 设置属性项 }
    IGPImage.RemovePropertyItem(); { 删除属性项 }
    
    IGPImage.PropertyIdList; { 获取图像属性 ID 数组 }
    IGPImage.PropertyItems;  { 获取图像属性集合 }
    

    IGPImage.PropertyItems 指向一个 IGPPropertyItems 类型的数组;
    IGPPropertyItem 是 IGPPropertyItems 属性数组中的一个属性(或叫属性项).

    每个属性项都包含:
    IGPPropertyItem.Id;        { 属性 ID, 也就是属性类别, 譬如是标题还是版权说明等 }
    IGPPropertyItem.ValueType; { 属性的数据类型 }
    IGPPropertyItem.Length;    { 属性数据长度 }
    IGPPropertyItem.Value;     { 属性数据指针 }
    

    IGPImage.PropertyIdList 只是获取属性 ID 的数组.

    IGPPropertyItem.ValueType 常数:
    PropertyTagTypeByte        = 1; { 字节数组 }
    PropertyTagTypeASCII       = 2; { PAnsiChar }
    PropertyTagTypeShort       = 3; { Word }
    PropertyTagTypeLong        = 4; { Cardinal }
    PropertyTagTypeRational    = 5; { Cardinal/Cardinal; 第一个数是分子, 第二个数是分母 }
    PropertyTagTypeUndefined   = 7; { 可包含任何数据类型的字节数组 }
    PropertyTagTypeSLONG       = 9; { Integer }
    PropertyTagTypeSRational  = 10; { Integer/Integer; 第一个数是分子, 第二个数是分母 }
    

    IGPPropertyItem.Id 常数:
    PropertyTagGpsVer                         = $0000
    PropertyTagGpsLatitudeRef                 = $0001
    PropertyTagGpsLatitude                    = $0002
    PropertyTagGpsLongitudeRef                = $0003
    PropertyTagGpsLongitude                   = $0004
    PropertyTagGpsAltitudeRef                 = $0005
    PropertyTagGpsAltitude                    = $0006
    PropertyTagGpsGpsTime                     = $0007
    PropertyTagGpsGpsSatellites               = $0008
    PropertyTagGpsGpsStatus                   = $0009
    PropertyTagGpsGpsMeasureMode              = $000A
    PropertyTagGpsGpsDop                      = $000B
    PropertyTagGpsSpeedRef                    = $000C
    PropertyTagGpsSpeed                       = $000D
    PropertyTagGpsTrackRef                    = $000E
    PropertyTagGpsTrack                       = $000F
    PropertyTagGpsImgDirRef                   = $0010
    PropertyTagGpsImgDir                      = $0011
    PropertyTagGpsMapDatum                    = $0012
    PropertyTagGpsDestLatRef                  = $0013
    PropertyTagGpsDestLat                     = $0014
    PropertyTagGpsDestLongRef                 = $0015
    PropertyTagGpsDestLong                    = $0016
    PropertyTagGpsDestBearRef                 = $0017
    PropertyTagGpsDestBear                    = $0018
    PropertyTagGpsDestDistRef                 = $0019
    PropertyTagGpsDestDist                    = $001A
    PropertyTagNewSubfileType                 = $00FE
    PropertyTagSubfileType                    = $00FF
    PropertyTagImageWidth                     = $0100
    PropertyTagImageHeight                    = $0101
    PropertyTagBitsPerSample                  = $0102
    PropertyTagCompression                    = $0103
    PropertyTagPhotometricInterp              = $0106
    PropertyTagThreshHolding                  = $0107
    PropertyTagCellWidth                      = $0108
    PropertyTagCellHeight                     = $0109
    PropertyTagFillOrder                      = $010A
    PropertyTagDocumentName                   = $010D
    PropertyTagImageDescription               = $010E
    PropertyTagEquipMake                      = $010F
    PropertyTagEquipModel                     = $0110
    PropertyTagStripOffsets                   = $0111
    PropertyTagOrientation                    = $0112
    PropertyTagSamplesPerPixel                = $0115
    PropertyTagRowsPerStrip                   = $0116
    PropertyTagStripBytesCount                = $0117
    PropertyTagMinSampleValue                 = $0118
    PropertyTagMaxSampleValue                 = $0119
    PropertyTagXResolution                    = $011A
    PropertyTagYResolution                    = $011B
    PropertyTagPlanarConfig                   = $011C
    PropertyTagPageName                       = $011D
    PropertyTagXPosition                      = $011E
    PropertyTagYPosition                      = $011F
    PropertyTagFreeOffset                     = $0120
    PropertyTagFreeByteCounts                 = $0121
    PropertyTagGrayResponseUnit               = $0122
    PropertyTagGrayResponseCurve              = $0123
    PropertyTagT4Option                       = $0124
    PropertyTagT6Option                       = $0125
    PropertyTagResolutionUnit                 = $0128
    PropertyTagPageNumber                     = $0129
    PropertyTagTransferFunction               = $012D
    PropertyTagSoftwareUsed                   = $0131
    PropertyTagDateTime                       = $0132
    PropertyTagArtist                         = $013B
    PropertyTagHostComputer                   = $013C
    PropertyTagPredictor                      = $013D
    PropertyTagWhitePoint                     = $013E
    PropertyTagPrimaryChromaticities          = $013F
    PropertyTagColorMap                       = $0140
    PropertyTagHalftoneHints                  = $0141
    PropertyTagTileWidth                      = $0142
    PropertyTagTileLength                     = $0143
    PropertyTagTileOffset                     = $0144
    PropertyTagTileByteCounts                 = $0145
    PropertyTagInkSet                         = $014C
    PropertyTagInkNames                       = $014D
    PropertyTagNumberOfInks                   = $014E
    PropertyTagDotRange                       = $0150
    PropertyTagTargetPrinter                  = $0151
    PropertyTagExtraSamples                   = $0152
    PropertyTagSampleFormat                   = $0153
    PropertyTagSMinSampleValue                = $0154
    PropertyTagSMaxSampleValue                = $0155
    PropertyTagTransferRange                  = $0156
    PropertyTagJPEGProc                       = $0200
    PropertyTagJPEGInterFormat                = $0201
    PropertyTagJPEGInterLength                = $0202
    PropertyTagJPEGRestartInterval            = $0203
    PropertyTagJPEGLosslessPredictors         = $0205
    PropertyTagJPEGPointTransforms            = $0206
    PropertyTagJPEGQTables                    = $0207
    PropertyTagJPEGDCTables                   = $0208
    PropertyTagJPEGACTables                   = $0209
    PropertyTagYCbCrCoefficients              = $0211
    PropertyTagYCbCrSubsampling               = $0212
    PropertyTagYCbCrPositioning               = $0213
    PropertyTagREFBlackWhite                  = $0214
    PropertyTagGamma                          = $0301
    PropertyTagICCProfileDescriptor           = $0302
    PropertyTagSRGBRenderingIntent            = $0303
    PropertyTagImageTitle                     = $0320
    PropertyTagResolutionXUnit                = $5001
    PropertyTagResolutionYUnit                = $5002
    PropertyTagResolutionXLengthUnit          = $5003
    PropertyTagResolutionYLengthUnit          = $5004
    PropertyTagPrintFlags                     = $5005
    PropertyTagPrintFlagsVersion              = $5006
    PropertyTagPrintFlagsCrop                 = $5007
    PropertyTagPrintFlagsBleedWidth           = $5008
    PropertyTagPrintFlagsBleedWidthScale      = $5009
    PropertyTagHalftoneLPI                    = $500A
    PropertyTagHalftoneLPIUnit                = $500B
    PropertyTagHalftoneDegree                 = $500C
    PropertyTagHalftoneShape                  = $500D
    PropertyTagHalftoneMisc                   = $500E
    PropertyTagHalftoneScreen                 = $500F
    PropertyTagJPEGQuality                    = $5010
    PropertyTagGridSize                       = $5011
    PropertyTagThumbnailFormat                = $5012
    PropertyTagThumbnailWidth                 = $5013
    PropertyTagThumbnailHeight                = $5014
    PropertyTagThumbnailColorDepth            = $5015
    PropertyTagThumbnailPlanes                = $5016
    PropertyTagThumbnailRawBytes              = $5017
    PropertyTagThumbnailSize                  = $5018
    PropertyTagThumbnailCompressedSize        = $5019
    PropertyTagColorTransferFunction          = $501A
    PropertyTagThumbnailData                  = $501B
    PropertyTagThumbnailImageWidth            = $5020
    PropertyTagThumbnailImageHeight           = $5021
    PropertyTagThumbnailBitsPerSample         = $5022
    PropertyTagThumbnailCompression           = $5023
    PropertyTagThumbnailPhotometricInterp     = $5024
    PropertyTagThumbnailImageDescription      = $5025
    PropertyTagThumbnailEquipMake             = $5026
    PropertyTagThumbnailEquipModel            = $5027
    PropertyTagThumbnailStripOffsets          = $5028
    PropertyTagThumbnailOrientation           = $5029
    PropertyTagThumbnailSamplesPerPixel       = $502A
    PropertyTagThumbnailRowsPerStrip          = $502B
    PropertyTagThumbnailStripBytesCount       = $502C
    PropertyTagThumbnailResolutionX           = $502D
    PropertyTagThumbnailResolutionY           = $502E
    PropertyTagThumbnailPlanarConfig          = $502F
    PropertyTagThumbnailResolutionUnit        = $5030
    PropertyTagThumbnailTransferFunction      = $5031
    PropertyTagThumbnailSoftwareUsed          = $5032
    PropertyTagThumbnailDateTime              = $5033
    PropertyTagThumbnailArtist                = $5034
    PropertyTagThumbnailWhitePoint            = $5035
    PropertyTagThumbnailPrimaryChromaticities = $5036
    PropertyTagThumbnailYCbCrCoefficients     = $5037
    PropertyTagThumbnailYCbCrSubsampling      = $5038
    PropertyTagThumbnailYCbCrPositioning      = $5039
    PropertyTagThumbnailRefBlackWhite         = $503A
    PropertyTagThumbnailCopyRight             = $503B
    PropertyTagLuminanceTable                 = $5090
    PropertyTagChrominanceTable               = $5091
    PropertyTagFrameDelay                     = $5100
    PropertyTagLoopCount                      = $5101
    PropertyTagGlobalPalette                  = $5102
    PropertyTagIndexBackground                = $5103
    PropertyTagIndexTransparent               = $5104
    PropertyTagPixelUnit                      = $5110
    PropertyTagPixelPerUnitX                  = $5111
    PropertyTagPixelPerUnitY                  = $5112
    PropertyTagPaletteHistogram               = $5113
    PropertyTagCopyright                      = $8298
    PropertyTagExifExposureTime               = $829A
    PropertyTagExifFNumber                    = $829D
    PropertyTagExifIFD                        = $8769
    PropertyTagICCProfile                     = $8773
    PropertyTagExifExposureProg               = $8822
    PropertyTagExifSpectralSense              = $8824
    PropertyTagGpsIFD                         = $8825
    PropertyTagExifISOSpeed                   = $8827
    PropertyTagExifOECF                       = $8828
    PropertyTagExifVer                        = $9000
    PropertyTagExifDTOrig                     = $9003
    PropertyTagExifDTDigitized                = $9004
    PropertyTagExifCompConfig                 = $9101
    PropertyTagExifCompBPP                    = $9102
    PropertyTagExifShutterSpeed               = $9201
    PropertyTagExifAperture                   = $9202
    PropertyTagExifBrightness                 = $9203
    PropertyTagExifExposureBias               = $9204
    PropertyTagExifMaxAperture                = $9205
    PropertyTagExifSubjectDist                = $9206
    PropertyTagExifMeteringMode               = $9207
    PropertyTagExifLightSource                = $9208
    PropertyTagExifFlash                      = $9209
    PropertyTagExifFocalLength                = $920A
    PropertyTagExifMakerNote                  = $927C
    PropertyTagExifUserComment                = $9286
    PropertyTagExifDTSubsec                   = $9290
    PropertyTagExifDTOrigSS                   = $9291
    PropertyTagExifDTDigSS                    = $9292
    PropertyTagExifFPXVer                     = $A000
    PropertyTagExifColorSpace                 = $A001
    PropertyTagExifPixXDim                    = $A002
    PropertyTagExifPixYDim                    = $A003
    PropertyTagExifRelatedWav                 = $A004
    PropertyTagExifInterop                    = $A005
    PropertyTagExifFlashEnergy                = $A20B
    PropertyTagExifSpatialFR                  = $A20C
    PropertyTagExifFocalXRes                  = $A20E
    PropertyTagExifFocalYRes                  = $A20F
    PropertyTagExifFocalResUnit               = $A210
    PropertyTagExifSubjectLoc                 = $A214
    PropertyTagExifExposureIndex              = $A215
    PropertyTagExifSensingMethod              = $A217
    PropertyTagExifFileSource                 = $A300
    PropertyTagExifSceneType                  = $A301
    PropertyTagExifCfaPattern                 = $A302
    

    遍历属性:
    uses GdiPlus;
    
    procedure TForm1.Button1Click(Sender: TObject);
    var
      Image: IGPImage;
      PropertyItem: IGPPropertyItem;
    begin
      Image := TGPImage.Create('C:\GdiPlusImg\FakePhoto.jpg');
    
      Memo1.Clear;
      for PropertyItem in Image.PropertyItems do with Memo1.Lines do
      begin
        Add(Format('Id: $%.4x', [PropertyItem.Id]));
        Add(Format('ValueType: %d', [PropertyItem.ValueType]));
        Add(Format('Length: %d', [PropertyItem.Length]));
        Add(Format('Value: $%p', [PropertyItem.Value]));
        Add(EmptyStr);
      end;
    end;
    

    只遍历属性 ID:
    uses GdiPlus;
    
    procedure TForm1.Button1Click(Sender: TObject);
    var
      Image: IGPImage;
      PropID: Cardinal;
    begin
      Image := TGPImage.Create('C:\GdiPlusImg\FakePhoto.jpg');
    
      Memo1.Clear;
      for PropID in Image.PropertyIdList do
      begin
        Memo1.Lines.Add(Format('$%.4x', [PropID]));
      end;
    end;
    

    下面例子测试了 SetPropertyItem、GetPropertyItem、RemovePropertyItem 三个方法.

    先给图像添加了标题属性(其属性 ID 是 PropertyTagImageTitle);
    保存图像后重新打开再读取这个属性;
    删除这个属性后有试着找了找...
    uses GdiPlus;
    
    procedure TForm1.Button1Click(Sender: TObject);
    var
      Image: IGPImage;
      PropTitle: IGPPropertyItem;
      Title: AnsiString;
      i: Integer;
    begin
      ChDir('C:\GdiPlusImg\');
      Image := TGPImage.Create('FakePhoto.jpg');
    
      //
      Title := 'New Title';
      PropTitle := TGPPropertyItem.Create;
      PropTitle.Id := PropertyTagImageTitle;
      PropTitle.ValueType := PropertyTagTypeASCII;
      PropTitle.Length := Length(Title) + 1;
      PropTitle.Value := PAnsiChar(Title);
    
      Image.SetPropertyItem(PropTitle);
      Image.Save('FakePhoto_Test.jpg', TGPImageFormat.Jpeg);
      Image := nil;
    
      //
      PropTitle := nil;
      Image := TGPImage.Create('FakePhoto_Test.jpg');
      PropTitle := Image.GetPropertyItem(PropertyTagImageTitle);
      ShowMessage(PAnsiChar(PropTitle.Value)); { New Title }
    
      //
      Image.RemovePropertyItem(PropertyTagImageTitle);
      for i := 0 to Image.PropertyIdList.Count - 1 do
        if Image.PropertyIdList[i] = PropertyTagImageTitle then
          ShowMessage('检测到属性标题存在');   { 已删除不会再有了 }
    end;
    
  • 相关阅读:
    C#执行异步操作的几种方式
    spring boot swagger ui使用 nginx 部署后无法使用问题
    PHP支付宝接口RSA验证
    认证加密算法php hash_hmac和java hmacSha1的问题
    如何实现从 Redis 中订阅消息转发到 WebSocket 客户端
    ffmpeg安装
    nginx静态资源反向代理
    Redis基础知识 之——发布/订阅
    linux下安装git
    php实现无限级分类查询(递归、非递归)
  • 原文地址:https://www.cnblogs.com/del/p/1634844.html
Copyright © 2020-2023  润新知