ReNamer:Scripts:Exiv2

From den4b Wiki
Revision as of 15:01, 8 February 2017 by Den4b (talk | contribs) (Text replacement - "</source>" to "</syntaxhighlight>")
Jump to navigation Jump to search

Script integrates Exiv2 library in order to extract EXIF/IPTC/XMP tags from many types of images. CRW, CR2, RAW images are also supported.

Requirements

Code 1

Author: Denis Kozlov. Date: 2013-04-01.

Extract unformatted line out of the command line output of the exiv2.exe tool. This sample script extracts Image Timestamp, but you can adjust EXIV and TAG constants to extract other tags.

Hint: Image Timestamp value is usually formatted as "yyyy:mm:dd hh:mm:ss" which contains an illegal filename character ":". The illegal character can be easily replaced using an additional Replace rule.

  • Tested with ReNamer 5.74.4 Beta.

<source> { Extract EXIF/IPTC/XMP tags using Exiv2 }

const

 EXE = 'exiv2.exe';
 TAG = 'Image timestamp\s*\:\s*(.*?)[\r\n]';

var

 Command, Output: String;
 Matches: TWideStringArray;  

begin

 Command := EXE+' "'+FilePath+'"';
 if ExecConsoleApp(Command, Output) = 0 then
 begin
   Matches := SubMatchesRegEx(Output, TAG, False);
   if Length(Matches) > 0 then
     FileName := Matches[0] + WideExtractFileExt(FileName);
 end;

end. </syntaxhighlight>

To extract IPTC Headline tag, you would need to make following changes: <source> EXE = 'exiv2.exe -pi'; TAG = 'Iptc.Application2.Headline\s*\w*\s*\d*\s*(.*?)[\r\n]'; </syntaxhighlight>

Code 2

Author: Denis Kozlov. Date: 2015-11-25.

Extract EXIF date and reformat it according to user specification (DATE_FORMAT constant).

  • Tested with ReNamer 6.3.

<source> const

 EXIV = 'exiv2.exe';
 DATE_TAG = 'Image timestamp\s*\:\s*(.*?)[\r\n]';
 DATE_PARTS = '(.+)\:(.+)\:(.+)\ (.+)\:(.+)\:(.+)';
 DATE_FORMAT = 'YYYY-MM-DD HH.NN.SS';

var

 Command, Output: String;
 Matches, DateParts: TWideStringArray;
 Year, Month, Day, Hours, Minutes, Seconds: Integer;
 Date: TDateTime;
 DateOK: Boolean;

begin

 Command := EXIV + ' "' + FilePath + '"';
 if ExecConsoleApp(Command, Output) = 0 then
 begin
   Matches := SubMatchesRegEx(Output, DATE_TAG, False);
   if Length(Matches) > 0 then
   begin
     DateParts := SubMatchesRegEx(Matches[0], DATE_PARTS, False);
     if Length(DateParts) > 0 then
     begin
       DateOK :=
         TryStrToInt(DateParts[0], Year) and TryStrToInt(DateParts[1], Month) and
         TryStrToInt(DateParts[2], Day) and TryStrToInt(DateParts[3], Hours) and
         TryStrToInt(DateParts[4], Minutes) and TryStrToInt(DateParts[5], Seconds);
       if DateOK then
       begin
         Date := EncodeDateTime(Year, Month, Day, Hours, Minutes, Seconds, 0);
         FileName := FormatDateTime(DATE_FORMAT, Date) + WideExtractFileExt(FileName);
       end;
     end;
   end;
 end;

end. </syntaxhighlight>