Exif example for Delphi

This example does the following:

1.

Read all of the comments in an existing Exif file, updating the CommentCommentProperty array.

2.

Loads and modifies the file's image.

3.

Updates some of the comments in the comment array.

4.

Saves the file.

5.

Reads and displays the updated comments.

Note: Comments for GIF, TIFF, and DICOM files are simpler than the ones in this Exif example. With those file types, all of the comments are strings that you can get and set with simple assignments.

procedure TForm1.Button1Click(Sender: TObject);
var
   MyCommentText: string; { String for CMNT_USERCOMMENT }
   MyCommentSize: Integer; { Size of the comment array }
   NewCommentText: string; { String for CMNT_USERCOMMENT that}
   MyRasterIO: LEADRasterIO;
   MyRasterProcess: LEADRasterProcess;
   TmpString: string; { For parsing the comment string into bytes }
   FilePath, DistanceString, ThisDate, MyMsg: string; {Miscellaneous }
   ArraySize: Integer; { Array measurements }
   i: Integer; { Counter }
   RasterVarEmpty: LEADRasterVariant;
   RasterVar1: LEADRasterVariant;
   RasterVar2: LEADRasterVariant;
   RasterVar3: LEADRasterVariant;
begin
   MyRasterIO:= CreateComObject (CLASS_LEADRasterIO ) as LEADRasterIO;
   MyRasterProcess:= CreateComObject (CLASS_LEADRasterProcess) as LEADRasterProcess;
   RasterVarEmpty:= coLEADRasterVariant.Create ( );
   RasterVar1:= coLEADRasterVariant.Create ( );
   RasterVar2:= coLEADRasterVariant.Create ( );
   RasterVar3:= coLEADRasterVariant.Create ( );

   //Specify the file that we will update.
   FilePath:= 'c:\exif1.tif';
   //Get all of the current comments from an Exif file.
   //Temporarily disable method errors so that we do not fail when comments are missing.
   MyRasterIO.EnableMethodErrors:= False;
   For i:= 0 to CMNT_LAST do
   begin
     MyRasterIO.Comment [i]:= RasterVarEmpty;
     MyRasterIO.Comment[i]:= MyRasterIO.ReadComment (LEADRasterView1.Raster, FilePath, 0, i)
   end;
   MyRasterIO.EnableMethodErrors:= True;
   //Load and modify the image.
   MyRasterIO.Load (LEADRasterView1.Raster, FilePath, 0, 0, 1);
   MyRasterProcess.Reverse (LEADRasterView1.Raster);

   { Update the date when the file is generated. }
   ThisDate:= FormatDateTime('yyyy:mm:dd hh:nn:ss', Now);
   RasterVar1.Type_:= VALUE_STRING;
   RasterVar1.StringValue:= ThisDate;

   MyRasterIO.Comment[CMNT_SZDATETIMEDIGITIZED]:= RasterVar1;
   MyRasterIO.Comment[CMNT_SZSUBSECTIMEDIGITIZED]:= RasterVarEmpty;
   //Change the subject distance to 4 1/3 meters.
   RasterVar2.Type_:= VALUE_ARRAY_LONG;
   RasterVar2.ItemCount:= 2;
   RasterVar2.LongItemValue[0]:= 13;
   RasterVar2.LongItemValue[1]:= 3;
   MyRasterIO.Comment [CMNT_SUBJECTDISTANCE]:= RasterVar2;
   //Specify the user comment string.
   MyCommentText:= 'This is my new comment.';
   MyCommentSize:= 8 + StrLen(PChar(MyCommentText));

   //Define the array for the user comment.
   RasterVar3.Type_:= VALUE_ARRAY_BYTE;
   RasterVar3.ItemCount:= MyCommentSize;

   //Fill in the ASCII prefix.
   RasterVar3.ShortItemValue[0]:= Byte('A');
   RasterVar3.ShortItemValue[1]:= Byte('S');
   RasterVar3.ShortItemValue[2]:= Byte('C');
   RasterVar3.ShortItemValue[3]:= Byte('I');
   RasterVar3.ShortItemValue[4]:= Byte('I');
   RasterVar3.ShortItemValue[5]:= Byte(0);
   RasterVar3.ShortItemValue[6]:= Byte(0);
   RasterVar3.ShortItemValue[7]:= Byte(0);
   //Fill in the rest of the comment, starting at the end.
   for i:= 8 to (MyCommentSize - 1) do
   begin
      TmpString:= Copy(MyCommentText, i-7, 1);
      RasterVar3.ShortItemValue[i]:= Byte (TmpString[1]);
   end;
   RasterVar3.ShortItemValue[MyCommentSize]:= Byte (0);

   //Update the user comment.
   MyRasterIO.Comment[CMNT_USERCOMMENT]:= RasterVarEmpty;
   MyRasterIO.Comment [CMNT_USERCOMMENT]:= RasterVar3;
   //Save the file and read the comments that we saved.
   MyRasterIO.Save(LEADRasterView1.Raster, FilePath, FILE_EXIF, 24, 0, SAVE_OVERWRITE);
   RasterVar1:= MyRasterIO.ReadComment (LEADRasterView1.Raster, FilePath, 1, CMNT_SZDATETIMEDIGITIZED);
   RasterVar2:= MyRasterIO.ReadComment(LEADRasterView1.Raster, FilePath, 1, CMNT_SUBJECTDISTANCE);
   RasterVar3:= MyRasterIO.ReadComment(LEADRasterView1.Raster, FilePath, 1, CMNT_USERCOMMENT);

   //Interpret the Subject-Distance RATIONAL.
   DistanceString:= FloatToStr(RasterVar2.LongItemValue[0] / RasterVar2.LongItemValue[1]);

   //Initialize the string for the message box.
   MyMsg:= 'Subject Distance:= ' + DistanceString + Chr(13) + 'Date/Time:= ' + RasterVar1.StringValue;
   //Add the ASCII comment if it is there
   if (RasterVar3.ShortItemValue[0] = Byte ('A')) then
   begin
      ArraySize:= RasterVar3.ItemCount;
      for i:= 8 to ArraySize do
        begin
          NewCommentText:= NewCommentText + Chr(Integer(RasterVar3.ShortItemValue[i]));
        end;
        MyMsg:= MyMsg + Chr(13) + Chr(13) + NewCommentText;
   end;

    //Display the message.
   Application.MessageBox(PChar(MyMsg), 'File Comments', mb_OK);
   //Clear the comments from memory
   for i:= 0 to CMNT_LAST do
     MyRasterIO.Comment [i]:= RasterVarEmpty;
end;