Page 1 of 3

Reading Exif/GPS data from loaded image

Posted: Tue Nov 08, 2011 1:11 pm
by communi
Hi,

is there a piece of VB sample code how to read the in Exif data stored GPS data (Lat, Long, Alt etc.)of a jpg file which is currently displayed in ImageViewer and display the GPS data in a textbox etc.? The helpfile was not really helpful in this case.... ;)

Regards,
Communi

Re: Reading Exif/GPS data from loaded image

Posted: Wed Nov 09, 2011 10:52 am
by Alex
Hello,

Here is a snippet of code which shows how to get information about EXIF tags of JPEG file:

Code: Select all

Imports System.IO
Imports Vintasoft.Imaging
Imports Vintasoft.Imaging.Codecs.Jpeg
Imports Vintasoft.Imaging.Codecs.Tiff

Module Module1

    Sub Main()
        Using jpegStream As FileStream = New FileStream("..\..\Exif.jpg", FileMode.Open, FileAccess.Read)
            Using jpeg As JpegFile = New JpegFile(jpegStream)

                Dim exif As ExifData = jpeg.Page.Exif
                If exif Is Nothing Then
                    Console.WriteLine("JPEG file does not have EXIF data.")
                Else
                    WriteTagsData("EXIF", exif.ExifTags)
                    WriteTagsData("GPS", exif.GpsTags)
                End If

            End Using
        End Using

        Console.WriteLine("Press any key to continue...")
        Console.ReadKey()
    End Sub

    Sub WriteTagsData(ByRef tagsName As String, ByRef tags As TiffTagCollection)
        If tags.Count = 0 Then
            Console.WriteLine(String.Format("No {0} data.", tagsName))
        Else
            Console.WriteLine(String.Format("{0} data [{1}]:", tagsName, tags.Count))
            For i = 0 To tags.Count - 1
                Console.WriteLine(String.Format("- {0}", tags(i)))
            Next
        End If
        Console.WriteLine()
    End Sub

End Module
Best regards, Alexander

Re: Reading Exif/GPS data from loaded image

Posted: Wed Nov 09, 2011 1:06 pm
by communi
Hi Alex,

I tried this code changed to WinForms code - but no luck. Instead of the GPS data in the Textbox is always only "- Vintasoft.Imaging.Codecs.Tiff.TiffTag" displayed( and the photo has GPS data). If I take a photo without geotags it recognises this correctly and displays "No GPS data". So whats wrong?
Here is the code I have used:

Code: Select all

Imports System.IO
Imports Vintasoft.Imaging
Imports Vintasoft.Imaging.Codecs.Jpeg
Imports Vintasoft.Imaging.Codecs.Tiff

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Using jpegStream As FileStream = New FileStream("..\..\geotag005.jpg", FileMode.Open, FileAccess.Read)
        Using jpeg As JpegFile = New JpegFile(jpegStream)
            Dim exif As ExifData = jpeg.Page.Exif
            If exif Is Nothing Then
                TextBox1.Text = "JPEG file does not have EXIF data."
            Else
                WriteTagsData("EXIF", exif.ExifTags)
                WriteTagsData("GPS", exif.GpsTags)
            End If
        End Using
    End Using
End Sub

Public Sub WriteTagsData(ByRef tagsName As String, ByRef tags As TiffTagCollection)
    If tags.Count = 0 Then
        TextBox1.Text = String.Format("No {0} data.", tagsName)
    Else
        TextBox1.Text = String.Format("{0} data [{1}]:", tagsName, tags.Count)
        For i = 0 To tags.Count - 1
            TextBox1.Text = String.Format("- {0}", tags(i)) & vbCrLf
        Next
    End If
End Sub
Regards

Re: Reading Exif/GPS data from loaded image

Posted: Wed Nov 09, 2011 1:25 pm
by Alex
You need to use this code:

Code: Select all

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Using jpegStream As FileStream = New FileStream("..\..\geotag005.jpg", FileMode.Open, FileAccess.Read)
        Using jpeg As JpegFile = New JpegFile(jpegStream)

            Dim exif As ExifData = jpeg.Page.Exif
            If exif Is Nothing Then
                TextBox1.Text = "JPEG file does not have EXIF data."
            Else
                WriteTagsData("EXIF", exif.ExifTags)
                WriteTagsData("GPS", exif.GpsTags)
            End If

        End Using
    End Using
End Sub

Private Sub WriteTagsData(ByRef tagsName As String, ByRef tags As TiffTagCollection)
    If tags.Count = 0 Then
        TextBox1.Text = TextBox1.Text + String.Format("No {0} data.", tagsName) & vbCrLf
    Else
        TextBox1.Text = TextBox1.Text + String.Format("{0} data [{1}]:", tagsName, tags.Count) & vbCrLf
        Dim tag As TiffTag
        For i = 0 To tags.Count - 1
            tag = tags(i)
            TextBox1.Text = TextBox1.Text + String.Format("- Name={0}, Id={1}, Type={2}, Data={3}", tag.Name, tag.Id, tag.Type, tag.Data) & vbCrLf
        Next
    End If
    TextBox1.Text = TextBox1.Text + vbCrLf
End Sub
Best regards, Alexander

Re: Reading Exif/GPS data from loaded image

Posted: Wed Nov 09, 2011 1:44 pm
by communi
Thanks, this works fine! But there is no "real" content, no real data displayed, only this:

GPS data [7]:
- Name=InteroperabilityIndex, Id=1, Type=Ascii, Data=N
- Name=GPSLatitude, Id=2, Type=Rational, Data=Vintasoft.Imaging.Codecs.Tiff.Rational[]
- Name=GPSLongitudeRef, Id=3, Type=Ascii, Data=E
- Name=GPSLongitude, Id=4, Type=Rational, Data=Vintasoft.Imaging.Codecs.Tiff.Rational[]
- Name=GPSAltitudeRef, Id=5, Type=Byte, Data=0
- Name=GPSAltitude, Id=6, Type=Rational, Data=83889 / 278
- Name=GPSTimeStamp, Id=7, Type=Rational, Data=Vintasoft.Imaging.Codecs.Tiff.Rational[]

Is this normal?

Re: Reading Exif/GPS data from loaded image

Posted: Thu Nov 10, 2011 8:27 am
by Alex
Hello,

You need to convert arrays to string.

Here is a snippet of code:

Code: Select all

Private Sub WriteTagsData(ByRef tagsName As String, ByRef tags As TiffTagCollection)
    If tags.Count = 0 Then
        TextBox1.Text = TextBox1.Text + String.Format("No {0} data.", tagsName) & vbCrLf
    Else
        TextBox1.Text = TextBox1.Text + String.Format("{0} data [{1}]:", tagsName, tags.Count) & vbCrLf
        Dim tag As TiffTag
        Dim tagData As Object
        Dim tagDataAsArray As Array
        Dim tagDataAsString As String
        ' for each tag in tag collection
        For i = 0 To tags.Count - 1
            ' get tag
            tag = tags(i)

            ' get tag data
            tagData = tag.Data
            ' if tag data is array
            If IsArray(tagData) Then
                tagDataAsString = "[ "
                tagDataAsArray = CType(tagData, Array)
                For j = 0 To tagDataAsArray.Length - 1
                    tagDataAsString = tagDataAsString + tagDataAsArray(j).ToString + "; "
                Next
                tagDataAsString = tagDataAsString + "]"

            ' if tag data is NOT array
            Else
                tagDataAsString = tagData.ToString()
            End If

            ' add information about tag to textbox
            TextBox1.Text = TextBox1.Text + String.Format("- Name={0}, Id={1}, Type={2}, Data={3}", tag.Name, tag.Id, tag.Type, tagDataAsString) & vbCrLf
        Next
    End If
    TextBox1.Text = TextBox1.Text + vbCrLf
End Sub
Best regards, Alexander

Re: Reading Exif/GPS data from loaded image

Posted: Thu Nov 10, 2011 10:38 am
by communi
Hi Alex,

now it works great!! Thank you! I only have to find a way to convert the data values to a human readable format ;) Any ideas? :D

But one question. The Name of the first data is "InteroperabilityIndex" but the correct name should be "GPSLatitudeRef", why the code doesn't recognize this? The exif data in the image are correct, other software shows this name correctly as "GPSLatitudeRef"
GPS data [7]:
- Name=InteroperabilityIndex, Id=1, Type=Ascii, Data=N
- Name=GPSLatitude, Id=2, Type=Rational, Data=[ xxxxx ]
- Name=GPSLongitudeRef, Id=3, Type=Ascii, Data=E
- Name=GPSLongitude, Id=4, Type=Rational, Data=[xxxxx]
- Name=GPSAltitudeRef, Id=5, Type=Byte, Data=0
- Name=GPSAltitude, Id=6, Type=Rational, Data=83889 / 278
- Name=GPSTimeStamp, Id=7, Type=Rational, Data=[ 15 / 1; 47 / 1; 32 / 1; ]

Re: Reading Exif/GPS data from loaded image

Posted: Thu Nov 10, 2011 4:45 pm
by Alex
We have fixed bug in version 4.3.35.5 of SDK and now your code will work correctly.

But the following code is better:

Code: Select all

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Using jpegStream As FileStream = New FileStream("..\..\geotag005.jpg", FileMode.Open, FileAccess.Read)
        Using jpeg As JpegFile = New JpegFile(jpegStream)

            Dim exif As ExifData = jpeg.Page.Exif
            If exif Is Nothing Then
                TextBox1.Text = "JPEG file does not have EXIF data."
            Else
                WriteTagsData("EXIF", exif.ExifTags, GetType(ExifTagId))
                WriteTagsData("GPS", exif.GpsTags, GetType(GpsTagId))
            End If

        End Using
    End Using
End Sub

Private Sub WriteTagsData(ByRef tagsName As String, ByRef tags As TiffTagCollection, ByRef tagIdEnumType As Type)
    If tags.Count = 0 Then
        TextBox1.Text = TextBox1.Text + String.Format("No {0} data.", tagsName) & vbCrLf
    Else
        TextBox1.Text = TextBox1.Text + String.Format("{0} data [{1}]:", tagsName, tags.Count) & vbCrLf
        Dim tag As TiffTag
        Dim tagData As Object
        Dim tagDataAsArray As Array
        Dim tagDataAsString As String
        ' for each tag in tag collection
        For i = 0 To tags.Count - 1
            ' get tag
            tag = tags(i)

            ' get tag data
            tagData = tag.Data
            ' if tag data is array
            If IsArray(tagData) Then

                tagDataAsString = "[ "
                tagDataAsArray = CType(tagData, Array)
                For j = 0 To tagDataAsArray.Length - 1
                    tagDataAsString = tagDataAsString + tagDataAsArray(j).ToString + "; "
                Next
                tagDataAsString = tagDataAsString + "]"

                ' if tag data is NOT array
            Else
                tagDataAsString = tagData.ToString()
            End If

            ' add information about tag to textbox
            TextBox1.Text = TextBox1.Text + String.Format("- Name={0}, Id={1}, Type={2}, Data={3}", tag.GetName(tagIdEnumType), tag.Id, tag.Type, tagDataAsString) & vbCrLf
        Next
    End If
    TextBox1.Text = TextBox1.Text + vbCrLf
End Sub
Best regards, Alexander

Re: Reading Exif/GPS data from loaded image

Posted: Thu Nov 10, 2011 10:41 pm
by communi
Alex,
Thank You!!! :) Now it works fine with the latest version, great job!!!!!!

Re: Reading Exif/GPS data from loaded image

Posted: Wed Feb 01, 2012 10:08 am
by js95007
Hey guys don't know if this post is still active, but still worth a shot
I have tried to use the latest code Alex gave, but ended up with three errors.
These probably where trivial errors on my part (I'm something of a novice ;) ) but I haven't been able to solve it, so here goes:

Using jpeg As JpegFile = New JpegFile(jpegStream) --- "jpeg is not defined"
Private Sub WriteTagsData(ByRef tagsName As String, ByRef tags As TiffTagCollection, ByRef tagIdEnumType As Type) --- "TiffTagCollection is not defined"
Dim tag As TiffTag --- "TiffTag is not defined"

Hope you can shed some light, I have spent the last three days endlessly searching for how to extract GPS info from an image in Visual Basic :?
Thanks for any help you can give, it will be greatly appreciated