Browse Source

UPD: Exif - convert string date time to TDateTime

Alexander Koblov 2 years ago
parent
commit
f11df0168b
2 changed files with 29 additions and 7 deletions
  1. 26 4
      src/uexifreader.pas
  2. 3 3
      src/uexifwdx.pas

+ 26 - 4
src/uexifreader.pas

@@ -57,10 +57,11 @@ type
     FImageWidth: UInt16;
     FImageHeight: UInt16;
     FOrientation: UInt16;
-    FDateTimeOriginal: String;
+    FDateTimeOriginal: TDateTime;
   private
     procedure Reset;
     function ReadString(Offset, Count: Int32): String;
+    function ReadDateTime(Offset, Count: Int32): TDateTime;
     procedure ReadTag(var ATag: TTag);
     function DoImageFileDirectory: Boolean;
   public
@@ -70,7 +71,7 @@ type
     property ImageWidth: UInt16 read FImageWidth;
     property ImageHeight: UInt16 read FImageHeight;
     property Orientation: UInt16 read FOrientation;
-    property DateTimeOriginal: String read FDateTimeOriginal;
+    property DateTimeOriginal: TDateTime read FDateTimeOriginal;
   end;
 
 resourcestring
@@ -96,7 +97,7 @@ begin
   FOrientation:= 0;
   FMake:= EmptyStr;
   FModel:= EmptyStr;
-  FDateTimeOriginal:= EmptyStr;
+  FDateTimeOriginal:= 0;
 end;
 
 function TExifReader.ReadString(Offset, Count: Int32): String;
@@ -115,6 +116,27 @@ begin
   end;
 end;
 
+function TExifReader.ReadDateTime(Offset, Count: Int32): TDateTime;
+var
+  S: String;
+  SystemTime: TSystemTime;
+begin
+  S:= ReadString(Offset, Count);
+  try
+    SystemTime.Millisecond:= 0;
+    // Data format is "YYYY:MM:DD HH:MM:SS"
+    SystemTime.Year:= StrToDWord(Copy(S, 1, 4));
+    SystemTime.Month:= StrToDWord(Copy(S, 6, 2));
+    SystemTime.Day:= StrToDWord(Copy(S, 9, 2));
+    SystemTime.Hour:= StrToDWord(Copy(S, 12, 2));
+    SystemTime.Minute:= StrToDWord(Copy(S, 15, 2));
+    SystemTime.Second:= StrToDWord(Copy(S, 18, 2));
+    Result:= SystemTimeToDateTime(SystemTime);
+  except
+    Result:= 0;
+  end;
+end;
+
 procedure TExifReader.ReadTag(var ATag: TTag);
 begin
   Self.ReadBuffer(ATag, SizeOf(TTag));
@@ -189,7 +211,7 @@ begin
       case ATag.ID of
         $9003: // Date/Time of original image taken
           begin
-            FDateTimeOriginal:= ReadString(ATag.Offset, ATag.Count);
+            FDateTimeOriginal:= ReadDateTime(ATag.Offset, ATag.Count);
           end;
         // Image pixel width
         $A002: if FImageWidth = 0 then FImageWidth := ATag.Offset;

+ 3 - 3
src/uexifwdx.pas

@@ -99,7 +99,7 @@ begin
   AddField(rsImageWidth, ft_numeric_32);
   AddField(rsImageHeight, ft_numeric_32);
   AddField(rsOrientation, ft_numeric_32);
-  AddField(rsDateTimeOriginal, ft_string);
+  AddField(rsDateTimeOriginal, ft_datetime);
 end;
 
 procedure TExifWdx.CallContentSetDefaultParams;
@@ -135,7 +135,7 @@ begin
       2: if FExif.ImageWidth > 0 then Result:= FExif.ImageWidth;
       3: if FExif.ImageHeight > 0 then Result:= FExif.ImageHeight;
       4: if FExif.Orientation > 0 then Result:= FExif.Orientation;
-      5: if Length(FExif.DateTimeOriginal) > 0 then Result:= FExif.DateTimeOriginal;
+      5: if FExif.DateTimeOriginal > 0 then Result:= FExif.DateTimeOriginal;
     end;
   finally
     LeaveCriticalSection(FMutex);
@@ -155,7 +155,7 @@ begin
       2: if FExif.ImageWidth > 0 then Result:= IntToStr(FExif.ImageWidth);
       3: if FExif.ImageHeight > 0 then Result:= IntToStr(FExif.ImageHeight);
       4: if FExif.Orientation > 0 then Result:= IntToStr(FExif.Orientation);
-      5: Result:= FExif.DateTimeOriginal;
+      5: Result:= DateTimeToStr(FExif.DateTimeOriginal);
     end;
   finally
     LeaveCriticalSection(FMutex);