You've already forked lazarus-ccr
applications
bindings
components
Comba_Animation
aboutcomponent
acs
beepfp
callite
captcha
chelper
chemtext
cmdline
cmdlinecfg
colorpalette
cryptini
csvdocument
epiktimer
everettrandom
examplecomponent
exctrls
extrasyn
fpexif
delphi examples
examples
languages
tests
multiread
pictures
readwrite
unittest
common
fetexifbe.pas
fetexifle.pas
fetiptc.pas
fettestutils.pas
fetutils.pas
dunit
fpExifTests.ico
fpExifTests.lpi
fpExifTests.lpr
fpExifTests_Delphi.dpr
fpExifTests_Delphi.dproj
fpExifTests_Delphi.res
fpExifTests_Delphi7.cfg
fpExifTests_Delphi7.dof
fpExifTests_Delphi7.dpr
fpExifTests_Delphi7.dproj
fpExifTests_Delphi7.res
tools
fpeexifdata.pas
fpeexifreadwrite.pas
fpeglobal.pas
fpeiptcdata.pas
fpeiptcreadwrite.pas
fpemakernote.pas
fpemakernotecanon.pas
fpemakernotecasio.pas
fpemakernoteepson.pas
fpemakernotefuji.pas
fpemakernoteminolta.pas
fpemakernotenikon.pas
fpemakernoteolympus.pas
fpemakernotesanyo.pas
fpemetadata.pas
fpestrconsts.pas
fpetags.pas
fpeutils.pas
fpexif.inc
fpexif_fpc.inc
fpexif_pkg.lpk
fpexif_pkg.pas
fpexmpdata.pas
fpexmpreadwrite.pas
readme.txt
fpsound
fpspreadsheet
fractions
freetypepascal
geckoport
gradcontrols
grid_semaphor
gridprinter
industrialstuff
iosdesigner
iphonelazext
jujiboutils
jvcllaz
kcontrols
lazautoupdate
lazbarcodes
lazmapviewer
lclextensions
longtimer
manualdock
mbColorLib
mplayer
multithreadprocs
nvidia-widgets
onguard
orpheus
playsoundpackage
poweredby
powerpdf
rgbgraphics
richmemo
richview
rtfview
rx
scrolltext
smnetgradient
spktoolbar
splashabout
svn
systools
tdi
thtmlport
tparadoxdataset
tvplanit
xdev_toolkit
zlibar
zmsql
examples
image_sources
lclbindings
wst
816 lines
36 KiB
ObjectPascal
816 lines
36 KiB
ObjectPascal
![]() |
unit fetIptc;
|
||
|
|
||
|
{$IFDEF FPC}
|
||
|
{$mode objfpc}{$H+}
|
||
|
{$ENDIF}
|
||
|
|
||
|
interface
|
||
|
|
||
|
uses
|
||
|
Classes, SysUtils,
|
||
|
{$ifdef FPC}
|
||
|
fpcunit, testutils, testregistry;
|
||
|
{$else}
|
||
|
fetTestUtils, TestFrameWork;
|
||
|
{$endif}
|
||
|
|
||
|
const
|
||
|
// Picture with Exif data, jpeg and tiff
|
||
|
IptcJpegPic = '..\pictures\originals\with_iptc.jpg';
|
||
|
IptcTiffPic = '..\pictures\originals\with_iptc.tif';
|
||
|
WorkFile_JpegWithIptc = 'pictures\with_iptc.jpg';
|
||
|
WorkFile_TiffWithIptc = 'pictures\with_iptc.tif';
|
||
|
|
||
|
// Picture without Iptc data
|
||
|
NoIptcPic = '..\pictures\originals\no_metadata.jpg';
|
||
|
WorkFile_NoIptc = 'pictures\no_iptc.jpg';
|
||
|
|
||
|
type
|
||
|
TstIptc = class(TTestCase)
|
||
|
protected
|
||
|
procedure SetUp; override;
|
||
|
procedure TearDown; override;
|
||
|
procedure Internal_CheckHasIptc(AFileName: String; ExpectIptc: Boolean);
|
||
|
published
|
||
|
procedure CheckForPictures;
|
||
|
procedure CheckCreateImgInfo;
|
||
|
procedure CheckHasIptc;
|
||
|
procedure ReadIptcTest_Jpeg;
|
||
|
procedure ReadIptcTest_Tiff;
|
||
|
procedure CreateIptcTest;
|
||
|
procedure WriteIptcTest_Jpeg;
|
||
|
end;
|
||
|
|
||
|
implementation
|
||
|
|
||
|
uses
|
||
|
{$IFDEF FPC}
|
||
|
Graphics, FileUtil,
|
||
|
{$ELSE}
|
||
|
Graphics, Jpeg,
|
||
|
{$ENDIF}
|
||
|
fpeGlobal, fpeUtils, fpeTags, fpeIptcData, fpeMetadata;
|
||
|
|
||
|
procedure TstIptc.SetUp;
|
||
|
var
|
||
|
dir: String;
|
||
|
begin
|
||
|
if FileExists(WorkFile_NoIptc) then
|
||
|
DeleteFile(WorkFile_NoIptc);
|
||
|
if FileExists(WorkFile_JpegWithIptc) then
|
||
|
DeleteFile(WorkFile_JpegWithIptc);
|
||
|
if FileExists(WorkFile_TiffWithIptc) then
|
||
|
DeleteFile(WorkFile_TiffWithIptc);
|
||
|
|
||
|
dir := ExtractFileDir(WorkFile_JpegWithIptc);
|
||
|
if not DirectoryExists(dir) then
|
||
|
ForceDirectories(dir);
|
||
|
|
||
|
if not FileExists(WorkFile_JpegWithIptc) then
|
||
|
if FileExists(IptcJpegPic) then
|
||
|
CopyFile(IptcJPegPic, WorkFile_JpegWithIptc);
|
||
|
if not FileExists(WorkFile_TiffWithIptc) then
|
||
|
if FileExists(IptcTiffPic) then
|
||
|
CopyFile(IptcTiffPic, WorkFile_TiffWithIptc);
|
||
|
if not FileExists(WorkFile_NoIptc) then
|
||
|
if FileExists(NoIptcPic) then
|
||
|
CopyFile(NoIptcPic, WorkFile_NoIptc);
|
||
|
end;
|
||
|
|
||
|
procedure TstIptc.TearDown;
|
||
|
begin
|
||
|
if FileExists(WorkFile_NoIptc) then
|
||
|
DeleteFile(WorkFile_NoIptc);
|
||
|
if FileExists(WorkFile_JpegWithIptc) then
|
||
|
DeleteFile(WorkFile_JpegWithIptc);
|
||
|
if FileExists(WorkFile_TiffWithIptc) then
|
||
|
DeleteFile(WorkFile_TiffWithIptc);
|
||
|
end;
|
||
|
|
||
|
procedure TstIptc.CheckForPictures;
|
||
|
begin
|
||
|
CheckTrue(FileExists(IptcJPegPic), 'Original test picture file "' + IptcJpegPic + '" does not exist');
|
||
|
CheckTrue(FileExists(IptcTiffPic), 'Original test picture file "' + IptcTiffPic + '" does not exist');
|
||
|
CheckTrue(FileExists(NoIptcPic), 'Original test picture file "' + NoIptcPic + '" does not exist');
|
||
|
|
||
|
CheckTrue(FileExists(WorkFile_JpegWithIptc), 'Test picture file "' + WorkFile_JpegWithIptc + '" does not exist');
|
||
|
CheckTrue(FileExists(WorkFile_TiffWithIptc), 'Test picture file "' + WorkFile_TiffWithIptc + '" does not exist');
|
||
|
CheckTrue(FileExists(WorkFile_NoIptc), 'Test picture file "' + WorkFile_NoIptc + '" does not exist');
|
||
|
end;
|
||
|
|
||
|
procedure TstIptc.CheckCreateImgInfo;
|
||
|
var
|
||
|
imgInfo: TImgInfo;
|
||
|
begin
|
||
|
imgInfo := TImgInfo.Create();
|
||
|
try
|
||
|
CheckIs(imgInfo, TImgInfo, 'Is not TImgInfo');
|
||
|
finally
|
||
|
imgInfo.Free;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TstIptc.Internal_CheckHasIptc(AFileName: String; ExpectIptc: Boolean);
|
||
|
var
|
||
|
imgInfo: TImgInfo;
|
||
|
begin
|
||
|
imgInfo := TImgInfo.Create;
|
||
|
try
|
||
|
imgInfo.LoadFromFile(AFileName);
|
||
|
if ExpectIptc then
|
||
|
CheckTrue(imgInfo.HasIptc, 'Failure to detect IPTC in test picture file "' + AFileName + '"')
|
||
|
else
|
||
|
CheckFalse(imgInfo.HasIptc, 'Unexected IPTC in test picture file "' + AFileName + '" detected');
|
||
|
finally
|
||
|
imgInfo.Free;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TstIptc.CheckHasIptc;
|
||
|
begin
|
||
|
Internal_CheckHasIptc(WorkFile_JpegWithIptc, true);
|
||
|
Internal_CheckHasIptc(WorkFile_TiffWithIptc, true);
|
||
|
Internal_CheckHasIptc(WorkFile_NoIptc, false);
|
||
|
end;
|
||
|
|
||
|
procedure TstIptc.ReadIptcTest_Jpeg;
|
||
|
{ Output of ExifTool for the test image with exif (using parameters -G -H -s):
|
||
|
(All these values are checked)
|
||
|
|
||
|
[IPTC] 0x0005 ObjectName Title of the test image <-- ok
|
||
|
[IPTC] 0x0007 EditStatus finished <-- ok
|
||
|
[IPTC] 0x000a Urgency 5 (normal urgency) <-- ok
|
||
|
[IPTC] 0x000f Category TST <-- ok
|
||
|
[IPTC] 0x0016 FixtureIdentifier JobID_1 <-- is named "FixtureID" by fpExif
|
||
|
[IPTC] 0x0019 Keywords yellow, red, blue, green, rectangles <-- ok
|
||
|
[IPTC] 0x001a ContentLocationCode USA <-- ok
|
||
|
[IPTC] 0x001e ReleaseDate 2017:10:15 <-- ok
|
||
|
[IPTC] 0x0023 ReleaseTime 22:34:47 <-- ok
|
||
|
[IPTC] 0x0028 SpecialInstructions No other comments <-- is named "SpecialInstruct" by fpExif
|
||
|
[IPTC] 0x0037 DateCreated 2017:10:15 <-- ok
|
||
|
[IPTC] 0x003c TimeCreated 12:11:59 <-- ok
|
||
|
[IPTC] 0x0041 OriginatingProgram PhotoFiltre <-- ok
|
||
|
[IPTC] 0x0046 ProgramVersion 7 <-- ok
|
||
|
[IPTC] 0x004b ObjectCycle Both Morning and Evening <-- value is encoded as "both" by fpExif
|
||
|
[IPTC] 0x0050 By-line wp <-- ok
|
||
|
[IPTC] 0x0055 By-lineTitle Staff <-- ok
|
||
|
[IPTC] 0x005a City My hometown <-- ok
|
||
|
[IPTC] 0x005c Sub-location My suburb <-- is named "SubLocation" by fpExif
|
||
|
[IPTC] 0x005f Province-State My province <-- is named "State" by fpexif
|
||
|
[IPTC] 0x0064 Country-PrimaryLocationCode USA <-- is named "LocationCode" by fpExif
|
||
|
[IPTC] 0x0065 Country-PrimaryLocationName My country <-- is named "LocationName" by fpExif
|
||
|
[IPTC] 0x0067 OriginalTransmissionReference requested by myself <-- is named "TransmissionRef" by fpExif
|
||
|
[IPTC] 0x0069 Headline Test image <-- ok
|
||
|
[IPTC] 0x006e Credit FPC <-- is named "ImageCredit" by fpExif
|
||
|
[IPTC] 0x0073 Source self-made <-- ok
|
||
|
[IPTC] 0x0074 CopyrightNotice (c) wp <-- is named "Copyright" by fpExif
|
||
|
[IPTC] 0x0076 Contact w.p@wp.com, +123 4567890 <-- ok
|
||
|
[IPTC] 0x0078 Caption-Abstract Test image <-- is named "ImageCaption" by fpExif
|
||
|
[IPTC] 0x007a Writer-Editor wp <-- is named "ImageCaptionWriter by fpExif
|
||
|
}
|
||
|
var
|
||
|
imgInfo: TImgInfo;
|
||
|
lTag: TTag;
|
||
|
begin
|
||
|
imgInfo := TImgInfo.Create;
|
||
|
try
|
||
|
imgInfo.LoadFromFile(WorkFile_JpegWithIptc);
|
||
|
CheckTrue(imgInfo.HasIptc, 'IPTC in test picture file "' + WorkFile_JpegWithIptc + '" not found');
|
||
|
|
||
|
// The following pieces of information are obtained from the IPTC segment
|
||
|
|
||
|
lTag := imgInfo.IptcData.TagByName['ObjectName'];
|
||
|
CheckTrue(lTag <> nil, 'Tag "ObjectName" not found');
|
||
|
CheckEquals('Title of the test image', lTag.AsString, 'Value mismatch in tag "ObjectName"');
|
||
|
|
||
|
lTag := imgInfo.IptcData.TagByName['EditStatus'];
|
||
|
CheckTrue(lTag <> nil, 'Tag "EditStatus" not found');
|
||
|
CheckEquals('finished', lTag.AsString, 'Value mismatch in tag "EditStatus"');
|
||
|
|
||
|
lTag := imgInfo.IptcData.TagByName['Urgency'];
|
||
|
CheckTrue(lTag <> nil, 'Tag "Urgency" not found');
|
||
|
lTag.DecodeValue:= false;
|
||
|
CheckEquals('5', lTag.AsString, 'Value mismatch in tag "Urgency"');
|
||
|
|
||
|
lTag := imgInfo.IptcData.TagByName['Category'];
|
||
|
CheckTrue(lTag <> nil, 'Tag "Category" not found');
|
||
|
CheckEquals('TST', lTag.AsString, 'Value mismatch in tag "Category"');
|
||
|
|
||
|
lTag := imgInfo.IptcData.TagByName['FixtureID'];
|
||
|
CheckTrue(lTag <> nil, 'Tag "FixtureID" not found');
|
||
|
CheckEquals('JobID_1', lTag.AsString, 'Value mismatch in tag "FixtureID"');
|
||
|
|
||
|
lTag := imgInfo.IptcData.TagByName['Keywords'];
|
||
|
CheckTrue(lTag <> nil, 'Tag "Keywords" not found');
|
||
|
CheckEquals('yellow, red, blue, green, rectangles', lTag.AsString, 'Value mismatch of tag "Keywords"');
|
||
|
|
||
|
lTag := imgInfo.IptcData.TagByName['ContentLocCode'];
|
||
|
CheckTrue(lTag <> nil, 'Tag "ContentLocCode" not found');
|
||
|
CheckEquals('USA', lTag.AsString, 'Value mismatch of tag "ContentLocCode"');
|
||
|
|
||
|
lTag := imgInfo.IptcData.TagByName['ReleaseDate'];
|
||
|
CheckTrue(lTag <> nil, 'Tag "ReleaseDate" not found');
|
||
|
CheckEquals(TIptcDateTag, lTag.ClassType, 'Tag "ReleaseDate" is not a TIptcDateTag.');
|
||
|
TIptcDateTag(lTag).FormatStr := EXIF_DATE_FORMAT;
|
||
|
CheckEquals('2017:10:15', TIptcDateTag(lTag).AsString, 'Value mismatch of tag "ReleaseDate"');
|
||
|
|
||
|
lTag := imgInfo.IptcData.TagByName['ReleaseTime'];
|
||
|
CheckTrue(lTag <> nil, 'Tag "ReleaseTime" not found');
|
||
|
CheckEquals(TIptcTimeTag, lTag.ClassType, 'Tag "ReleaseTime" is not a TIptcTimeTag');
|
||
|
TIptcTimeTag(lTag).FormatStr := EXIF_TIME_FORMAT;
|
||
|
CheckEquals('22:34:47', TIptcTimeTag(lTag).AsString, 'Value mismatch of tag "ReleaseTime"');
|
||
|
|
||
|
lTag := imgInfo.IptcData.TagByName['SpecialInstruct'];
|
||
|
CheckTrue(lTag <> nil, 'Tag "SpecialInstruct" not found');
|
||
|
CheckEquals('No other comments', lTag.AsString, 'Value mismatch in tag "SpecialInstruct"');
|
||
|
|
||
|
lTag := imgInfo.IptcData.TagByName['DateCreated'];
|
||
|
CheckTrue(lTag <> nil, 'Tag "DateCreated" not found');
|
||
|
CheckEquals(TIptcDateTag, lTag.ClassType, 'Tag "DateCreated" is not a TIptcDateTag.');
|
||
|
TIptcDateTag(lTag).FormatStr := EXIF_DATE_FORMAT;
|
||
|
CheckEquals('2017:10:15', TIptcDateTag(lTag).AsString, 'Value mismatch of tag "DateCreated"');
|
||
|
|
||
|
lTag := imgInfo.IptcData.TagByName['TimeCreated'];
|
||
|
CheckTrue(lTag <> nil, 'Tag "TimeCreated" not found');
|
||
|
CheckEquals(TIptcTimeTag, lTag.ClassType, 'Tag "TimeCreated" is not a TIptcTimeTag');
|
||
|
TIptcTimeTag(lTag).FormatStr := EXIF_TIME_FORMAT;
|
||
|
CheckEquals('12:11:59', TIptcTimeTag(lTag).AsString, 'Value mismatch of tag "TimeCreated"');
|
||
|
|
||
|
lTag := imgInfo.IptcData.TagByName['OriginatingProgram'];
|
||
|
CheckTrue(lTag <> nil, 'Tag "OriginatingProgram" not found');
|
||
|
CheckEquals('PhotoFiltre', lTag.AsString, 'Value mismatch of tag "OriginatingProgram"');
|
||
|
|
||
|
lTag := imgInfo.IptcData.TagByName['ProgramVersion'];
|
||
|
CheckTrue(lTag <> nil, 'Tag "ProgramVersion" not found');
|
||
|
CheckEquals('7', lTag.AsString, 'Value mismatch of tag "ProgramVersion"');
|
||
|
|
||
|
lTag := imgInfo.IptcData.TagByName['ObjectCycle'];
|
||
|
CheckTrue(lTag <> nil, 'Tag "ObjectCycle" not found');
|
||
|
lTag.DecodeValue := true;
|
||
|
CheckEquals('both', lTag.AsString, 'Value mismatch of tag "ObjectCycle"');
|
||
|
|
||
|
lTag := imgInfo.IptcData.TagByName['ByLine'];
|
||
|
CheckTrue(lTag <> nil, 'Tag "ByLine" not found');
|
||
|
CheckEquals('wp', lTag.AsString, 'Value mismatch of tag "ByLine"');
|
||
|
|
||
|
lTag := imgInfo.IptcData.TagByName['ByLineTitle'];
|
||
|
CheckTrue(lTag <> nil, 'Tag "ByLineTitle" not found');
|
||
|
CheckEquals('Staff', lTag.AsString, 'Value mismatch of tag "ByLineTitle"');
|
||
|
|
||
|
lTag := imgInfo.IptcData.TagByName['City'];
|
||
|
CheckTrue(lTag <> nil, 'Tag "City" not found');
|
||
|
CheckEquals('My hometown', lTag.AsString, 'Value mismatch of tag "City"');
|
||
|
|
||
|
lTag := imgInfo.IptcData.TagByName['SubLocation'];
|
||
|
CheckTrue(lTag <> nil, 'Tag "SubLocation" not found');
|
||
|
CheckEquals('My suburb', lTag.AsString, 'Value mismatch of tag "SubLocation"');
|
||
|
|
||
|
lTag := imgInfo.IptcData.TagByName['State'];
|
||
|
CheckTrue(lTag <> nil, 'Tag "State" not found');
|
||
|
CheckEquals('My province', lTag.AsString, 'Value mismatch of tag "State"');
|
||
|
|
||
|
lTag := imgInfo.IptcData.TagByName['LocationCode'];
|
||
|
CheckTrue(lTag <> nil, 'Tag "LocationCode" not found');
|
||
|
CheckEquals('USA', lTag.AsString, 'Value mismatch of tag "LocationCode"');
|
||
|
|
||
|
lTag := imgInfo.IptcData.TagByName['LocationName'];
|
||
|
CheckTrue(lTag <> nil, 'Tag "LocationName" not found');
|
||
|
CheckEquals('My country', lTag.AsString, 'Value mismatch of tag "LocationName"');
|
||
|
|
||
|
lTag := imgInfo.IptcData.TagByName['TransmissionRef'];
|
||
|
CheckTrue(lTag <> nil, 'Tag "TransmissionRef" not found');
|
||
|
CheckEquals('requested by myself', lTag.AsString, 'Value mismatch of tag "TransmissionRef"');
|
||
|
|
||
|
lTag := imgInfo.IptcData.TagByName['ImageHeadline'];
|
||
|
CheckTrue(lTag <> nil, 'Tag "ImageHeadline" not found');
|
||
|
CheckEquals('Test image', lTag.AsString, 'Value mismatch of tag "ImageHeadline"');
|
||
|
|
||
|
lTag := imgInfo.IptcData.TagByName['ImageCredit'];
|
||
|
CheckTrue(lTag <> nil, 'Tag "ImageCredit" not found');
|
||
|
CheckEquals('FPC', lTag.AsString, 'Value mismatch of tag "ImageCredit"');
|
||
|
|
||
|
lTag := imgInfo.IptcData.TagByName['Source'];
|
||
|
CheckTrue(lTag <> nil, 'Tag "Source" not found');
|
||
|
CheckEquals('self-made', lTag.AsString, 'Value mismatch of tag "Source"');
|
||
|
|
||
|
lTag := imgInfo.IptcData.TagByName['Copyright'];
|
||
|
CheckTrue(lTag <> nil, 'Tag "Copyright" not found');
|
||
|
CheckEquals('(c) wp', lTag.AsString, 'Value mismatch of tag "Copyright"');
|
||
|
|
||
|
lTag := imgInfo.IptcData.TagByName['Contact'];
|
||
|
CheckTrue(lTag <> nil, 'Tag "Contact" not found');
|
||
|
CheckEquals('w.p@wp.com, +123 4567890', lTag.AsString, 'Value mismatch of tag "Contact"');
|
||
|
|
||
|
lTag := imgInfo.IptcData.TagByName['ImageCaption'];
|
||
|
CheckTrue(lTag <> nil, 'Tag "ImageCaption" not found');
|
||
|
CheckEquals('Test image', lTag.AsString, 'Value mismatch of tag "ImageCaption"');
|
||
|
|
||
|
lTag := imgInfo.IptcData.TagByName['ImageCaptionWriter'];
|
||
|
CheckTrue(lTag <> nil, 'Tag "ImageCaptionWriter" not found');
|
||
|
CheckEquals('wp', lTag.AsString, 'Value mismatch of tag "ImageCaptionWriter"');
|
||
|
|
||
|
finally
|
||
|
imgInfo.Free;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TstIptc.ReadIptcTest_Tiff;
|
||
|
{ Output of ExifTool for the test image with IPTC
|
||
|
|
||
|
exiftool -G -H -s with_iptc.tif > with_iptc_tif.txt
|
||
|
|
||
|
(All these values are checked)
|
||
|
|
||
|
[IPTC] 0x0005 ObjectName : Title of the test image
|
||
|
[IPTC] 0x0007 EditStatus : finished
|
||
|
[IPTC] 0x000a Urgency : 5 (normal urgency)
|
||
|
[IPTC] 0x000f Category : TST
|
||
|
[IPTC] 0x0016 FixtureIdentifier : JobID_1
|
||
|
[IPTC] 0x0019 Keywords : yellow, red, blue, green, rectangles
|
||
|
[IPTC] 0x001a ContentLocationCode : USA
|
||
|
[IPTC] 0x001e ReleaseDate : 2017:10:15
|
||
|
[IPTC] 0x0023 ReleaseTime : 22:34:47
|
||
|
[IPTC] 0x0028 SpecialInstructions : No other comments
|
||
|
[IPTC] 0x0037 DateCreated : 2017:10:15
|
||
|
[IPTC] 0x003c TimeCreated : 12:11:59
|
||
|
[IPTC] 0x0041 OriginatingProgram : PhotoFiltre
|
||
|
[IPTC] 0x0046 ProgramVersion : 7
|
||
|
[IPTC] 0x004b ObjectCycle : Both Morning and Evening
|
||
|
[IPTC] 0x0050 By-line : wp
|
||
|
[IPTC] 0x0055 By-lineTitle : Staff
|
||
|
[IPTC] 0x005a City : My hometown
|
||
|
[IPTC] 0x005c Sub-location : My suburb
|
||
|
[IPTC] 0x005f Province-State : My province
|
||
|
[IPTC] 0x0064 Country-PrimaryLocationCode : USA
|
||
|
[IPTC] 0x0065 Country-PrimaryLocationName : My country
|
||
|
[IPTC] 0x0067 OriginalTransmissionReference : requested by myself
|
||
|
[IPTC] 0x0069 Headline : Test image
|
||
|
[IPTC] 0x006e Credit : FPC
|
||
|
[IPTC] 0x0073 Source : self-made
|
||
|
[IPTC] 0x0074 CopyrightNotice : (c) wp
|
||
|
[IPTC] 0x0076 Contact : w.p@wp.com, +123 4567890
|
||
|
[IPTC] 0x0078 Caption-Abstract : Test image
|
||
|
[IPTC] 0x007a Writer-Editor : wp
|
||
|
}
|
||
|
var
|
||
|
imgInfo: TImgInfo;
|
||
|
lTag: TTag;
|
||
|
begin
|
||
|
imgInfo := TImgInfo.Create;
|
||
|
try
|
||
|
imgInfo.LoadFromFile(WorkFile_TiffWithIptc);
|
||
|
CheckTrue(imgInfo.HasIptc, 'IPTC in test picture file "' + WorkFile_TiffWithIptc + '" not found');
|
||
|
|
||
|
// The following pieces of information are obtained from the IPTC segment
|
||
|
|
||
|
lTag := imgInfo.IptcData.TagByName['ObjectName'];
|
||
|
CheckTrue(lTag <> nil, 'Tag "ObjectName" not found');
|
||
|
CheckEquals('Title of the test image', lTag.AsString, 'Value mismatch in tag "ObjectName"');
|
||
|
|
||
|
lTag := imgInfo.IptcData.TagByName['EditStatus'];
|
||
|
CheckTrue(lTag <> nil, 'Tag "EditStatus" not found');
|
||
|
CheckEquals('finished', lTag.AsString, 'Value mismatch in tag "EditStatus"');
|
||
|
|
||
|
lTag := imgInfo.IptcData.TagByName['Urgency'];
|
||
|
CheckTrue(lTag <> nil, 'Tag "Urgency" not found');
|
||
|
lTag.DecodeValue:= false;
|
||
|
CheckEquals('5', lTag.AsString, 'Value mismatch in tag "Urgency"');
|
||
|
|
||
|
lTag := imgInfo.IptcData.TagByName['Category'];
|
||
|
CheckTrue(lTag <> nil, 'Tag "Category" not found');
|
||
|
CheckEquals('TST', lTag.AsString, 'Value mismatch in tag "Category"');
|
||
|
|
||
|
lTag := imgInfo.IptcData.TagByName['FixtureID'];
|
||
|
CheckTrue(lTag <> nil, 'Tag "FixtureID" not found');
|
||
|
CheckEquals('JobID_1', lTag.AsString, 'Value mismatch in tag "FixtureID"');
|
||
|
|
||
|
lTag := imgInfo.IptcData.TagByName['Keywords'];
|
||
|
CheckTrue(lTag <> nil, 'Tag "Keywords" not found');
|
||
|
CheckEquals('yellow, red, blue, green, rectangles', lTag.AsString, 'Value mismatch of tag "Keywords"');
|
||
|
|
||
|
lTag := imgInfo.IptcData.TagByName['ContentLocCode'];
|
||
|
CheckTrue(lTag <> nil, 'Tag "ContentLocCode" not found');
|
||
|
CheckEquals('USA', lTag.AsString, 'Value mismatch of tag "ContentLocCode"');
|
||
|
|
||
|
lTag := imgInfo.IptcData.TagByName['ReleaseDate'];
|
||
|
CheckTrue(lTag <> nil, 'Tag "ReleaseDate" not found');
|
||
|
CheckEquals(TIptcDateTag, lTag.ClassType, 'Tag "ReleaseDate" is not a TIptcDateTag.');
|
||
|
TIptcDateTag(lTag).FormatStr := EXIF_DATE_FORMAT;
|
||
|
CheckEquals('2017:10:15', TIptcDateTag(lTag).AsString, 'Value mismatch of tag "ReleaseDate"');
|
||
|
|
||
|
lTag := imgInfo.IptcData.TagByName['ReleaseTime'];
|
||
|
CheckTrue(lTag <> nil, 'Tag "ReleaseTime" not found');
|
||
|
CheckEquals(TIptcTimeTag, lTag.ClassType, 'Tag "ReleaseTime" is not a TIptcTimeTag');
|
||
|
TIptcTimeTag(lTag).FormatStr := EXIF_TIME_FORMAT;
|
||
|
CheckEquals('22:34:47', TIptcTimeTag(lTag).AsString, 'Value mismatch of tag "ReleaseTime"');
|
||
|
|
||
|
lTag := imgInfo.IptcData.TagByName['SpecialInstruct'];
|
||
|
CheckTrue(lTag <> nil, 'Tag "SpecialInstruct" not found');
|
||
|
CheckEquals('No other comments', lTag.AsString, 'Value mismatch in tag "SpecialInstruct"');
|
||
|
|
||
|
lTag := imgInfo.IptcData.TagByName['DateCreated'];
|
||
|
CheckTrue(lTag <> nil, 'Tag "DateCreated" not found');
|
||
|
CheckEquals(TIptcDateTag, lTag.ClassType, 'Tag "DateCreated" is not a TIptcDateTag.');
|
||
|
TIptcDateTag(lTag).FormatStr := EXIF_DATE_FORMAT;
|
||
|
CheckEquals('2017:10:15', TIptcDateTag(lTag).AsString, 'Value mismatch of tag "DateCreated"');
|
||
|
|
||
|
lTag := imgInfo.IptcData.TagByName['TimeCreated'];
|
||
|
CheckTrue(lTag <> nil, 'Tag "TimeCreated" not found');
|
||
|
CheckEquals(TIptcTimeTag, lTag.ClassType, 'Tag "TimeCreated" is not a TIptcTimeTag');
|
||
|
TIptcTimeTag(lTag).FormatStr := EXIF_TIME_FORMAT;
|
||
|
CheckEquals('12:11:59', TIptcTimeTag(lTag).AsString, 'Value mismatch of tag "TimeCreated"');
|
||
|
|
||
|
lTag := imgInfo.IptcData.TagByName['OriginatingProgram'];
|
||
|
CheckTrue(lTag <> nil, 'Tag "OriginatingProgram" not found');
|
||
|
CheckEquals('PhotoFiltre', lTag.AsString, 'Value mismatch of tag "OriginatingProgram"');
|
||
|
|
||
|
lTag := imgInfo.IptcData.TagByName['ProgramVersion'];
|
||
|
CheckTrue(lTag <> nil, 'Tag "ProgramVersion" not found');
|
||
|
CheckEquals('7', lTag.AsString, 'Value mismatch of tag "ProgramVersion"');
|
||
|
|
||
|
lTag := imgInfo.IptcData.TagByName['ObjectCycle'];
|
||
|
CheckTrue(lTag <> nil, 'Tag "ObjectCycle" not found');
|
||
|
lTag.DecodeValue := true;
|
||
|
CheckEquals('both', lTag.AsString, 'Value mismatch of tag "ObjectCycle"');
|
||
|
|
||
|
lTag := imgInfo.IptcData.TagByName['ByLine'];
|
||
|
CheckTrue(lTag <> nil, 'Tag "ByLine" not found');
|
||
|
CheckEquals('wp', lTag.AsString, 'Value mismatch of tag "ByLine"');
|
||
|
|
||
|
lTag := imgInfo.IptcData.TagByName['ByLineTitle'];
|
||
|
CheckTrue(lTag <> nil, 'Tag "ByLineTitle" not found');
|
||
|
CheckEquals('Staff', lTag.AsString, 'Value mismatch of tag "ByLineTitle"');
|
||
|
|
||
|
lTag := imgInfo.IptcData.TagByName['City'];
|
||
|
CheckTrue(lTag <> nil, 'Tag "City" not found');
|
||
|
CheckEquals('My hometown', lTag.AsString, 'Value mismatch of tag "City"');
|
||
|
|
||
|
lTag := imgInfo.IptcData.TagByName['SubLocation'];
|
||
|
CheckTrue(lTag <> nil, 'Tag "SubLocation" not found');
|
||
|
CheckEquals('My suburb', lTag.AsString, 'Value mismatch of tag "SubLocation"');
|
||
|
|
||
|
lTag := imgInfo.IptcData.TagByName['State'];
|
||
|
CheckTrue(lTag <> nil, 'Tag "State" not found');
|
||
|
CheckEquals('My province', lTag.AsString, 'Value mismatch of tag "State"');
|
||
|
|
||
|
lTag := imgInfo.IptcData.TagByName['LocationCode'];
|
||
|
CheckTrue(lTag <> nil, 'Tag "LocationCode" not found');
|
||
|
CheckEquals('USA', lTag.AsString, 'Value mismatch of tag "LocationCode"');
|
||
|
|
||
|
lTag := imgInfo.IptcData.TagByName['LocationName'];
|
||
|
CheckTrue(lTag <> nil, 'Tag "LocationName" not found');
|
||
|
CheckEquals('My country', lTag.AsString, 'Value mismatch of tag "LocationName"');
|
||
|
|
||
|
lTag := imgInfo.IptcData.TagByName['TransmissionRef'];
|
||
|
CheckTrue(lTag <> nil, 'Tag "TransmissionRef" not found');
|
||
|
CheckEquals('requested by myself', lTag.AsString, 'Value mismatch of tag "TransmissionRef"');
|
||
|
|
||
|
lTag := imgInfo.IptcData.TagByName['ImageHeadline'];
|
||
|
CheckTrue(lTag <> nil, 'Tag "ImageHeadline" not found');
|
||
|
CheckEquals('Test image', lTag.AsString, 'Value mismatch of tag "ImageHeadline"');
|
||
|
|
||
|
lTag := imgInfo.IptcData.TagByName['ImageCredit'];
|
||
|
CheckTrue(lTag <> nil, 'Tag "ImageCredit" not found');
|
||
|
CheckEquals('FPC', lTag.AsString, 'Value mismatch of tag "ImageCredit"');
|
||
|
|
||
|
lTag := imgInfo.IptcData.TagByName['Source'];
|
||
|
CheckTrue(lTag <> nil, 'Tag "Source" not found');
|
||
|
CheckEquals('self-made', lTag.AsString, 'Value mismatch of tag "Source"');
|
||
|
|
||
|
lTag := imgInfo.IptcData.TagByName['Copyright'];
|
||
|
CheckTrue(lTag <> nil, 'Tag "Copyright" not found');
|
||
|
CheckEquals('(c) wp', lTag.AsString, 'Value mismatch of tag "Copyright"');
|
||
|
|
||
|
lTag := imgInfo.IptcData.TagByName['Contact'];
|
||
|
CheckTrue(lTag <> nil, 'Tag "Contact" not found');
|
||
|
CheckEquals('w.p@wp.com, +123 4567890', lTag.AsString, 'Value mismatch of tag "Contact"');
|
||
|
|
||
|
lTag := imgInfo.IptcData.TagByName['ImageCaption'];
|
||
|
CheckTrue(lTag <> nil, 'Tag "ImageCaption" not found');
|
||
|
CheckEquals('Test image', lTag.AsString, 'Value mismatch of tag "ImageCaption"');
|
||
|
|
||
|
lTag := imgInfo.IptcData.TagByName['ImageCaptionWriter'];
|
||
|
CheckTrue(lTag <> nil, 'Tag "ImageCaptionWriter" not found');
|
||
|
CheckEquals('wp', lTag.AsString, 'Value mismatch of tag "ImageCaptionWriter"');
|
||
|
|
||
|
finally
|
||
|
imgInfo.Free;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TstIptc.CreateIptcTest;
|
||
|
var
|
||
|
imgInfo: TImgInfo;
|
||
|
begin
|
||
|
imgInfo := TImgInfo.Create;
|
||
|
try
|
||
|
CheckTrue(imgInfo.IptcData = nil, 'IPTC found, but not expected.');
|
||
|
imgInfo.CreateIptcData;
|
||
|
CheckTrue(imgInfo.IptcData <> nil, 'IPTC not found.');
|
||
|
finally
|
||
|
imgInfo.Free;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TstIptc.WriteIptcTest_Jpeg;
|
||
|
var
|
||
|
imgInfo: TImgInfo;
|
||
|
lTag: TTag;
|
||
|
begin
|
||
|
imgInfo := TImgInfo.Create;
|
||
|
try
|
||
|
// Create empty IPTC
|
||
|
imgInfo.CreateIptcData;
|
||
|
|
||
|
// Add tags
|
||
|
lTag := imgInfo.IptcData.AddTagByName('ObjectName');
|
||
|
CheckTrue(lTag <> nil, 'Tag "ObjectName" not found for writing');
|
||
|
lTag.AsString := 'Title of the test image';
|
||
|
|
||
|
lTag := imgInfo.IptcData.AddTagByName('EditStatus');
|
||
|
CheckTrue(lTag <> nil, 'Tag "EditStatus" not found for writing');
|
||
|
lTag.AsString := 'finished';
|
||
|
|
||
|
lTag := imgInfo.IptcData.AddTagByName('Urgency');
|
||
|
CheckTrue(lTag <> nil, 'Tag "Urgency" not found');
|
||
|
lTag.DecodeValue:= false;
|
||
|
lTag.AsString := '5';
|
||
|
|
||
|
lTag := imgInfo.IptcData.AddTagByName('Category');
|
||
|
CheckTrue(lTag <> nil, 'Tag "Category" not found');
|
||
|
lTag.AsString := 'TST';
|
||
|
|
||
|
lTag := imgInfo.IptcData.AddTagByName('FixtureID');
|
||
|
CheckTrue(lTag <> nil, 'Tag "FixtureID" not found');
|
||
|
lTag.AsString := 'JobID_1';
|
||
|
|
||
|
lTag := imgInfo.IptcData.AddTagByName('Keywords');
|
||
|
CheckTrue(lTag <> nil, 'Tag "Keywords" not found');
|
||
|
lTag.AsString := 'yellow, red, blue, green, rectangles';
|
||
|
|
||
|
lTag := imgInfo.IptcData.AddTagByName('ContentLocCode');
|
||
|
CheckTrue(lTag <> nil, 'Tag "ContentLocCode" not found');
|
||
|
lTag.AsString := 'USA';
|
||
|
|
||
|
lTag := imgInfo.IptcData.AddTagByName('ReleaseDate');
|
||
|
CheckTrue(lTag <> nil, 'Tag "ReleaseDate" not found');
|
||
|
CheckEquals(TIptcDateTag, lTag.ClassType, 'Tag "ReleaseDate" is not a TIptcDateTag.');
|
||
|
TIptcDateTag(lTag).FormatStr := EXIF_DATE_FORMAT;
|
||
|
lTag.AsString := '2017:10:15';
|
||
|
|
||
|
lTag := imgInfo.IptcData.AddTagByName('ReleaseTime');
|
||
|
CheckTrue(lTag <> nil, 'Tag "ReleaseTime" not found');
|
||
|
CheckEquals(TIptcTimeTag, lTag.ClassType, 'Tag "ReleaseTime" is not a TIptcTimeTag');
|
||
|
TIptcTimeTag(lTag).FormatStr := EXIF_TIME_FORMAT;
|
||
|
lTag.AsString := '22:34:47';
|
||
|
|
||
|
lTag := imgInfo.IptcData.AddTagByName('SpecialInstruct');
|
||
|
CheckTrue(lTag <> nil, 'Tag "SpecialInstruct" not found');
|
||
|
lTag.AsString := 'No other comments';
|
||
|
|
||
|
lTag := imgInfo.IptcData.AddTagByName('DateCreated');
|
||
|
CheckTrue(lTag <> nil, 'Tag "DateCreated" not found');
|
||
|
CheckEquals(TIptcDateTag, lTag.ClassType, 'Tag "DateCreated" is not a TIptcDateTag.');
|
||
|
TIptcDateTag(lTag).FormatStr := EXIF_DATE_FORMAT;
|
||
|
lTag.AsString := '2017:10:15';
|
||
|
|
||
|
lTag := imgInfo.IptcData.AddTagByName('TimeCreated');
|
||
|
CheckTrue(lTag <> nil, 'Tag "TimeCreated" not found');
|
||
|
CheckEquals(TIptcTimeTag, lTag.ClassType, 'Tag "TimeCreated" is not a TIptcTimeTag');
|
||
|
TIptcTimeTag(lTag).FormatStr := EXIF_TIME_FORMAT;
|
||
|
lTag.AsString := '12:11:59';
|
||
|
|
||
|
lTag := imgInfo.IptcData.AddTagByName('OriginatingProgram');
|
||
|
CheckTrue(lTag <> nil, 'Tag "OriginatingProgram" not found');
|
||
|
lTag.AsString := 'PhotoFiltre';
|
||
|
|
||
|
lTag := imgInfo.IptcData.AddTagByName('ProgramVersion');
|
||
|
CheckTrue(lTag <> nil, 'Tag "ProgramVersion" not found');
|
||
|
lTag.AsString := '7';
|
||
|
|
||
|
lTag := imgInfo.IptcData.AddTagByName('ObjectCycle');
|
||
|
CheckTrue(lTag <> nil, 'Tag "ObjectCycle" not found');
|
||
|
lTag.DecodeValue := true;
|
||
|
lTag.AsString := 'both';
|
||
|
|
||
|
lTag := imgInfo.IptcData.AddTagByName('ByLine');
|
||
|
CheckTrue(lTag <> nil, 'Tag "ByLine" not found');
|
||
|
lTag.AsString := 'wp';
|
||
|
|
||
|
lTag := imgInfo.IptcData.AddTagByName('ByLineTitle');
|
||
|
CheckTrue(lTag <> nil, 'Tag "ByLineTitle" not found');
|
||
|
lTag.AsString := 'Staff';
|
||
|
|
||
|
lTag := imgInfo.IptcData.AddTagByName('City');
|
||
|
CheckTrue(lTag <> nil, 'Tag "City" not found');
|
||
|
lTag.AsString := 'My hometown';
|
||
|
|
||
|
lTag := imgInfo.IptcData.AddTagByName('SubLocation');
|
||
|
CheckTrue(lTag <> nil, 'Tag "SubLocation" not found');
|
||
|
lTag.AsString := 'My suburb';
|
||
|
|
||
|
lTag := imgInfo.IptcData.AddTagByName('State');
|
||
|
CheckTrue(lTag <> nil, 'Tag "State" not found');
|
||
|
lTag.AsString := 'My province';
|
||
|
|
||
|
lTag := imgInfo.IptcData.AddTagByName('LocationCode');
|
||
|
CheckTrue(lTag <> nil, 'Tag "LocationCode" not found');
|
||
|
lTag.AsString := 'USA';
|
||
|
|
||
|
lTag := imgInfo.IptcData.AddTagByName('LocationName');
|
||
|
CheckTrue(lTag <> nil, 'Tag "LocationName" not found');
|
||
|
lTag.AsString := 'My country';
|
||
|
|
||
|
lTag := imgInfo.IptcData.AddTagByName('TransmissionRef');
|
||
|
CheckTrue(lTag <> nil, 'Tag "TransmissionRef" not found');
|
||
|
lTag.AsString := 'requested by myself';
|
||
|
|
||
|
lTag := imgInfo.IptcData.AddTagByName('ImageHeadline');
|
||
|
CheckTrue(lTag <> nil, 'Tag "ImageHeadline" not found');
|
||
|
lTag.AsString := 'Test image';
|
||
|
|
||
|
lTag := imgInfo.IptcData.AddTagByName('ImageCredit');
|
||
|
CheckTrue(lTag <> nil, 'Tag "ImageCredit" not found');
|
||
|
lTag.AsString := 'FPC';
|
||
|
|
||
|
lTag := imgInfo.IptcData.AddTagByName('Source');
|
||
|
CheckTrue(lTag <> nil, 'Tag "Source" not found');
|
||
|
lTag.AsString := 'self-made';
|
||
|
|
||
|
lTag := imgInfo.IptcData.AddTagByName('Copyright');
|
||
|
CheckTrue(lTag <> nil, 'Tag "Copyright" not found');
|
||
|
lTag.AsString := '(c) wp';
|
||
|
|
||
|
lTag := imgInfo.IptcData.AddTagByName('Contact');
|
||
|
CheckTrue(lTag <> nil, 'Tag "Contact" not found');
|
||
|
lTag.AsString := 'w.p@wp.com, +123 4567890';
|
||
|
|
||
|
lTag := imgInfo.IptcData.AddTagByName('ImageCaption');
|
||
|
CheckTrue(lTag <> nil, 'Tag "ImageCaption" not found');
|
||
|
lTag.AsString := 'Test image';
|
||
|
|
||
|
lTag := imgInfo.IptcData.AddTagByName('ImageCaptionWriter');
|
||
|
CheckTrue(lTag <> nil, 'Tag "ImageCaptionWriter" not found');
|
||
|
lTag.AsString := 'wp';
|
||
|
|
||
|
// Save to file;
|
||
|
// Takes the image data from WorkFile_WithIptc, replaces its IPTC with the
|
||
|
// current IPTC structure and writes to WorkFile_NoIptc.
|
||
|
imgInfo.SaveToFile(WorkFile_NoIptc, Workfile_JpegWithIptc);
|
||
|
finally
|
||
|
imgInfo.Free;
|
||
|
end;
|
||
|
|
||
|
// Read written file and check IPTC
|
||
|
imgInfo := TImgInfo.Create;
|
||
|
try
|
||
|
imgInfo.LoadFromFile(Workfile_NoIptc);
|
||
|
// Now there should be IPTC
|
||
|
CheckTrue(imgInfo.IptcData <> nil, 'IPTC not found.');
|
||
|
|
||
|
lTag := imgInfo.IptcData.TagByName['ObjectName'];
|
||
|
CheckTrue(lTag <> nil, 'Tag "ObjectName" not found for reading');
|
||
|
CheckEquals('Title of the test image', lTag.AsString, 'Value mismatch in tag "ObjectName"');
|
||
|
|
||
|
lTag := imgInfo.IptcData.TagByName['EditStatus'];
|
||
|
CheckTrue(lTag <> nil, 'Tag "EditStatus" not found for reading');
|
||
|
CheckEquals('finished', lTag.AsString, 'Value mismatch in tag "EditStatus"');
|
||
|
|
||
|
lTag := imgInfo.IptcData.TagByName['Urgency'];
|
||
|
CheckTrue(lTag <> nil, 'Tag "Urgency" not found');
|
||
|
lTag.DecodeValue:= false;
|
||
|
CheckEquals('5', lTag.AsString, 'Value mismatch in tag "Urgency"');
|
||
|
|
||
|
lTag := imgInfo.IptcData.TagByName['Category'];
|
||
|
CheckTrue(lTag <> nil, 'Tag "Category" not found');
|
||
|
CheckEquals('TST', lTag.AsString, 'Value mismatch in tag "Category"');
|
||
|
|
||
|
lTag := imgInfo.IptcData.TagByName['FixtureID'];
|
||
|
CheckTrue(lTag <> nil, 'Tag "FixtureID" not found');
|
||
|
CheckEquals('JobID_1', lTag.AsString, 'Value mismatch in tag "FixtureID"');
|
||
|
|
||
|
lTag := imgInfo.IptcData.TagByName['Keywords'];
|
||
|
CheckTrue(lTag <> nil, 'Tag "Keywords" not found');
|
||
|
CheckEquals('yellow, red, blue, green, rectangles', lTag.AsString, 'Value mismatch of tag "Keywords"');
|
||
|
|
||
|
lTag := imgInfo.IptcData.TagByName['ContentLocCode'];
|
||
|
CheckTrue(lTag <> nil, 'Tag "ContentLocCode" not found');
|
||
|
CheckEquals('USA', lTag.AsString, 'Value mismatch of tag "ContentLocCode"');
|
||
|
|
||
|
lTag := imgInfo.IptcData.TagByName['ReleaseDate'];
|
||
|
CheckTrue(lTag <> nil, 'Tag "ReleaseDate" not found');
|
||
|
CheckEquals(TIptcDateTag, lTag.ClassType, 'Tag "ReleaseDate" is not a TIptcDateTag.');
|
||
|
TIptcDateTag(lTag).FormatStr := EXIF_DATE_FORMAT;
|
||
|
CheckEquals('2017:10:15', TIptcDateTag(lTag).AsString, 'Value mismatch of tag "ReleaseDate"');
|
||
|
|
||
|
lTag := imgInfo.IptcData.TagByName['ReleaseTime'];
|
||
|
CheckTrue(lTag <> nil, 'Tag "ReleaseTime" not found');
|
||
|
CheckEquals(TIptcTimeTag, lTag.ClassType, 'Tag "ReleaseTime" is not a TIptcTimeTag');
|
||
|
TIptcTimeTag(lTag).FormatStr := EXIF_TIME_FORMAT;
|
||
|
CheckEquals('22:34:47', TIptcTimeTag(lTag).AsString, 'Value mismatch of tag "ReleaseTime"');
|
||
|
|
||
|
lTag := imgInfo.IptcData.TagByName['SpecialInstruct'];
|
||
|
CheckTrue(lTag <> nil, 'Tag "SpecialInstruct" not found');
|
||
|
CheckEquals('No other comments', lTag.AsString, 'Value mismatch in tag "SpecialInstruct"');
|
||
|
|
||
|
lTag := imgInfo.IptcData.TagByName['DateCreated'];
|
||
|
CheckTrue(lTag <> nil, 'Tag "DateCreated" not found');
|
||
|
CheckEquals(TIptcDateTag, lTag.ClassType, 'Tag "DateCreated" is not a TIptcDateTag.');
|
||
|
TIptcDateTag(lTag).FormatStr := EXIF_DATE_FORMAT;
|
||
|
CheckEquals('2017:10:15', TIptcDateTag(lTag).AsString, 'Value mismatch of tag "DateCreated"');
|
||
|
|
||
|
lTag := imgInfo.IptcData.TagByName['TimeCreated'];
|
||
|
CheckTrue(lTag <> nil, 'Tag "TimeCreated" not found');
|
||
|
CheckEquals(TIptcTimeTag, lTag.ClassType, 'Tag "TimeCreated" is not a TIptcTimeTag');
|
||
|
TIptcTimeTag(lTag).FormatStr := EXIF_TIME_FORMAT;
|
||
|
CheckEquals('12:11:59', TIptcTimeTag(lTag).AsString, 'Value mismatch of tag "TimeCreated"');
|
||
|
|
||
|
lTag := imgInfo.IptcData.TagByName['OriginatingProgram'];
|
||
|
CheckTrue(lTag <> nil, 'Tag "OriginatingProgram" not found');
|
||
|
CheckEquals('PhotoFiltre', lTag.AsString, 'Value mismatch of tag "OriginatingProgram"');
|
||
|
|
||
|
lTag := imgInfo.IptcData.TagByName['ProgramVersion'];
|
||
|
CheckTrue(lTag <> nil, 'Tag "ProgramVersion" not found');
|
||
|
CheckEquals('7', lTag.AsString, 'Value mismatch of tag "ProgramVersion"');
|
||
|
|
||
|
lTag := imgInfo.IptcData.TagByName['ObjectCycle'];
|
||
|
CheckTrue(lTag <> nil, 'Tag "ObjectCycle" not found');
|
||
|
lTag.DecodeValue := true;
|
||
|
CheckEquals('both', lTag.AsString, 'Value mismatch of tag "ObjectCycle"');
|
||
|
|
||
|
lTag := imgInfo.IptcData.TagByName['ByLine'];
|
||
|
CheckTrue(lTag <> nil, 'Tag "ByLine" not found');
|
||
|
CheckEquals('wp', lTag.AsString, 'Value mismatch of tag "ByLine"');
|
||
|
|
||
|
lTag := imgInfo.IptcData.TagByName['ByLineTitle'];
|
||
|
CheckTrue(lTag <> nil, 'Tag "ByLineTitle" not found');
|
||
|
CheckEquals('Staff', lTag.AsString, 'Value mismatch of tag "ByLineTitle"');
|
||
|
|
||
|
lTag := imgInfo.IptcData.TagByName['City'];
|
||
|
CheckTrue(lTag <> nil, 'Tag "City" not found');
|
||
|
CheckEquals('My hometown', lTag.AsString, 'Value mismatch of tag "City"');
|
||
|
|
||
|
lTag := imgInfo.IptcData.TagByName['SubLocation'];
|
||
|
CheckTrue(lTag <> nil, 'Tag "SubLocation" not found');
|
||
|
CheckEquals('My suburb', lTag.AsString, 'Value mismatch of tag "SubLocation"');
|
||
|
|
||
|
lTag := imgInfo.IptcData.TagByName['State'];
|
||
|
CheckTrue(lTag <> nil, 'Tag "State" not found');
|
||
|
CheckEquals('My province', lTag.AsString, 'Value mismatch of tag "State"');
|
||
|
|
||
|
lTag := imgInfo.IptcData.TagByName['LocationCode'];
|
||
|
CheckTrue(lTag <> nil, 'Tag "LocationCode" not found');
|
||
|
CheckEquals('USA', lTag.AsString, 'Value mismatch of tag "LocationCode"');
|
||
|
|
||
|
lTag := imgInfo.IptcData.TagByName['LocationName'];
|
||
|
CheckTrue(lTag <> nil, 'Tag "LocationName" not found');
|
||
|
CheckEquals('My country', lTag.AsString, 'Value mismatch of tag "LocationName"');
|
||
|
|
||
|
lTag := imgInfo.IptcData.TagByName['TransmissionRef'];
|
||
|
CheckTrue(lTag <> nil, 'Tag "TransmissionRef" not found');
|
||
|
CheckEquals('requested by myself', lTag.AsString, 'Value mismatch of tag "TransmissionRef"');
|
||
|
|
||
|
lTag := imgInfo.IptcData.TagByName['ImageHeadline'];
|
||
|
CheckTrue(lTag <> nil, 'Tag "ImageHeadline" not found');
|
||
|
CheckEquals('Test image', lTag.AsString, 'Value mismatch of tag "ImageHeadline"');
|
||
|
|
||
|
lTag := imgInfo.IptcData.TagByName['ImageCredit'];
|
||
|
CheckTrue(lTag <> nil, 'Tag "ImageCredit" not found');
|
||
|
CheckEquals('FPC', lTag.AsString, 'Value mismatch of tag "ImageCredit"');
|
||
|
|
||
|
lTag := imgInfo.IptcData.TagByName['Source'];
|
||
|
CheckTrue(lTag <> nil, 'Tag "Source" not found');
|
||
|
CheckEquals('self-made', lTag.AsString, 'Value mismatch of tag "Source"');
|
||
|
|
||
|
lTag := imgInfo.IptcData.TagByName['Copyright'];
|
||
|
CheckTrue(lTag <> nil, 'Tag "Copyright" not found');
|
||
|
CheckEquals('(c) wp', lTag.AsString, 'Value mismatch of tag "Copyright"');
|
||
|
|
||
|
lTag := imgInfo.IptcData.TagByName['Contact'];
|
||
|
CheckTrue(lTag <> nil, 'Tag "Contact" not found');
|
||
|
CheckEquals('w.p@wp.com, +123 4567890', lTag.AsString, 'Value mismatch of tag "Contact"');
|
||
|
|
||
|
lTag := imgInfo.IptcData.TagByName['ImageCaption'];
|
||
|
CheckTrue(lTag <> nil, 'Tag "ImageCaption" not found');
|
||
|
CheckEquals('Test image', lTag.AsString, 'Value mismatch of tag "ImageCaption"');
|
||
|
|
||
|
lTag := imgInfo.IptcData.TagByName['ImageCaptionWriter'];
|
||
|
CheckTrue(lTag <> nil, 'Tag "ImageCaptionWriter" not found');
|
||
|
CheckEquals('wp', lTag.AsString, 'Value mismatch of tag "ImageCaptionWriter"');
|
||
|
|
||
|
finally
|
||
|
imgInfo.Free;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
|
||
|
initialization
|
||
|
{$IFDEF FPC}
|
||
|
RegisterTest(TstIptc);
|
||
|
{$ELSE}
|
||
|
TestFramework.RegisterTest(TstIptc.Suite);
|
||
|
{$ENDIF}
|
||
|
|
||
|
end.
|
||
|
|