Exif example for Visual Basic

Note: Also works with Access 95 and 97.

This example does the following:

1.

Read 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.

Dim MyCommentText As String 'String for CMNT_USERCOMMENT
Dim MyCommentSize As Integer 'Size of the comment array
Dim NewCommentText As String 'String for CMNT_USERCOMMENT that we read
Dim FilePath, DistanceString, ThisDate, ThisTime, MyMsg 'Miscellaneous
Dim i As Integer 'Counter
Dim ArraySize 'Size of an array
Dim MyRasterIO As New LEADRasterIO
Dim MyRasterProcess As New LEADRasterProcess
Dim RasterVarEmpty As New LEADRasterVariant
Dim RasterVar1 As New LEADRasterVariant
Dim RasterVar2 As New LEADRasterVariant
Dim RasterVar3 As New LEADRasterVariant

'Specify the file that we will update. 
FilePath = "d:\work\images\exif2.xif"
'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
  MyRasterIO.Comment(i) = RasterVarEmpty
  MyRasterIO.Comment(i) = MyRasterIO.ReadComment(LEADRasterView1.Raster, FilePath, 0, i) 
Next i
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 = Format(Date, "yyyy:mm:dd ")
ThisTime = Format(Time, "hh:mm:ss")
RasterVar1.Type = VALUE_STRING
RasterVar1.StringValue = ThisDate + ThisTime
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 + Len(MyCommentText) 

'Define the array for the user comment. 
RasterVar3.Type = VALUE_ARRAY_BYTE
RasterVar3.ItemCount = MyCommentSize

'Fill in the ASCII prefix. 
RasterVar3.ShortItemValue(0) = Asc("A")
RasterVar3.ShortItemValue(1) = Asc("S")
RasterVar3.ShortItemValue(2) = Asc("C")
RasterVar3.ShortItemValue(3) = Asc("I")
RasterVar3.ShortItemValue(4) = Asc("I")
RasterVar3.ShortItemValue(5) = &H0
RasterVar3.ShortItemValue(6) = &H0
RasterVar3.ShortItemValue(7) = &H0
'Fill in the rest of the comment, starting at the end. 
RasterVar3.ShortItemValue(MyCommentSize) = &H0
For i = MyCommentSize - 1 To 8 Step -1
  RasterVar3.ShortItemValue(i) = Asc(Right(MyCommentText, MyCommentSize - i)) 
Next i

'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 = 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 Chr$(RasterVar3.ShortItemValue(0)) = "A" Then
  ArraySize = RasterVar3.ItemCount
  NewCommentText = ""
  For i = 8 To ArraySize
    NewCommentText = NewCommentText + Chr$(RasterVar3.ShortItemValue(i)) 
  Next i
  MyMsg = MyMsg + Chr(13) + Chr(13) + NewCommentText
End If

'Display the message
MsgBox MyMsg
'Clear the comments from memory
For i = 0 To CMNT_LAST
  MyRasterIO.Comment(i) = RasterVarEmpty
Next i