Exif example for C++ Builder

This example does the following:

1.

Reads all of the comments in an existing Exif file, updating the Comment 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.

void __fastcall TForm1::Button1Click(TObject *Sender)
{
Variant Empty; /* For clearing comments */
   Variant SubjectDistance; /* Array for CMNT_SUBJECTDISTANCE */
   Variant NewSubjectDistance; /* Array to be updated by ReadComment */
   AnsiString  NewDateTime; /* String to be updated by ReadComment */
   Variant MyComment; /* Array for CMNT_USERCOMMENT */
   AnsiString MyCommentText; /* String for CMNT_USERCOMMENT */
   int MyCommentSize; /* Size of the comment array */
   Variant NewComment; /* Array to be updated by ReadComment */
   AnsiString NewCommentText; /* String for CMNT_USERCOMMENT that we read */
   AnsiString TmpString; /* For parsing the comment string into bytes */
   AnsiString FilePath, DistanceString, ThisDate, MyMsg; /*Miscellaneous */
   int ArraySize, LowerBound, UpperBound; /* Array measurements */
   int i; /* Counter */


   /* Create the Subject Distance arrays. */
   SubjectDistance = VarArrayCreate(OPENARRAY(int, (0,1)), varInteger);
   NewSubjectDistance = VarArrayCreate(OPENARRAY(int, (0,1)), varInteger);
   /* Specify the file that we will update. */
   FilePath = "c:\\lead\\images\\exif1.tif";
   /* Specify the Empty variant for clearing comments. */
   VarClear(Empty);
   /* Get all of the current comments from an Exif file. */
   /* Temporarily disable method errors so that we do not fail when comments are missing. */
   Lead1->EnableMethodErrors = False;
   for (i = 0; i <= CMNT_LAST; i++)
   {
      Lead1->Comment[i] = Empty;
      Lead1->Comment[i] = Lead1->ReadComment(FilePath, 0, i);
   }
   Lead1->EnableMethodErrors = True;
   /* Load and modify the image. */
   Lead1->Load(FilePath, 0, 0, 1);
   Lead1->Reverse();
   /* Update the date when the file is generated. */
   ThisDate = FormatDateTime("yyyy:mm:dd hh:nn:ss", Now());
   Lead1->Comment[CMNT_SZDATETIMEDIGITIZED] = ThisDate;
   Lead1->Comment[CMNT_SZSUBSECTIMEDIGITIZED] = Empty;
   /* Change the subject distance to 4 1/3 meters. */
   SubjectDistance.PutElement(13,0);
   SubjectDistance.PutElement(3,1);
   Lead1->Comment[CMNT_SUBJECTDISTANCE] = SubjectDistance;
   /* Specify the user comment string. */
   MyCommentText = "This is my new comment.";
   MyCommentSize = 8 + StrLen(MyCommentText.c_str());
   /* Define the array for the user comment. */
   MyComment = VarArrayCreate(OPENARRAY(int, (0, MyCommentSize)), varByte);
   /* Fill in the ASCII prefix. */
   MyComment.PutElement('A',0);
   MyComment.PutElement('S',1);
   MyComment.PutElement('C',2);
   MyComment.PutElement('I',3);
   MyComment.PutElement('I',4) ;
   MyComment.PutElement(0,5);
   MyComment.PutElement(0,6);
   MyComment.PutElement(0,7);
   /* Fill in the rest of the comment. */
   for (i = 8; i<= (MyCommentSize - 1); i++)
   {
      TmpString = MyCommentText.SubString(i-7, 1);
      MyComment.PutElement(Byte (TmpString[1]),i) ;
   }
   MyComment.PutElement(Byte (0),MyCommentSize) ;
   /* Update the user comment. */
   Lead1->Comment[CMNT_USERCOMMENT] = Empty;
   Lead1->Comment[CMNT_USERCOMMENT] = MyComment;
   /* Save the file and read the comments that we saved. */
   Lead1->Save(FilePath, FILE_EXIF, 24, 0, SAVE_OVERWRITE);
   NewDateTime = Lead1->ReadComment(FilePath, 0, CMNT_SZDATETIMEDIGITIZED);
   NewSubjectDistance = Lead1->ReadComment(FilePath, 0, CMNT_SUBJECTDISTANCE);
   NewComment = Lead1->ReadComment(FilePath, 0, CMNT_USERCOMMENT);
   /* Interpret the Subject-Distance RATIONAL. */
   DistanceString = FloatToStr((float)(NewSubjectDistance.GetElement(0)/NewSubjectDistance.GetElement(1)));
   /* Initialize the string for the message box. */
   MyMsg = "Subject Distance == " + DistanceString + "\n" + "Date/Time == " + NewDateTime;
   /* Add the ASCII comment if it is there. */
   if( NewComment.GetElement(0) == Byte ("A"))
   {
      UpperBound = VarArrayHighBound(NewComment, 1);
      LowerBound = VarArrayLowBound(NewComment, 1);
      ArraySize = UpperBound - LowerBound;
      for (i = 8; i <= ArraySize; i++ )
      {
         NewCommentText = NewCommentText + (char)(Integer(NewComment.GetElement(i)));
      }
      MyMsg = MyMsg + "\n\n" + NewCommentText;
   }
   /* Display the message. */
   Application->MessageBox(MyMsg.c_str(), "File Comments", MB_OK);
   /* Clear the comments from memory. */
   for (i = 0; i <= CMNT_LAST; i++) Lead1->Comment[i] = Empty;
}