Uusissa kameroissa on mahdollisuus tallentaa valokuvan Gps-sijainti exif tietoihin. Täässäpä koodi jolla tiedot saa luettua kuvasta. Minulla ei ollut esimerkkiaineistossa eteläiseltä eikä läntiseltä pallonpuoliskolta kuvia, joten niiden koordinaattien esitystapa täytyy vielä selvittää. Mutta arvon raati löytänee kai vastauksen tähänkin.
Eli formille Button ja sille koodi:
Dim Kuvannimi As String = "C:\Temp\sam_0152.jpg"
Dim Kuvausaika As String = ""
Dim Naste As Single = 0
Dim Nmin As Single = 0
Dim Nsec As Single = 0
Dim Easte As Single = 0
Dim Emin As Single = 0
Dim Esec As Single = 0
Dim sourceBitmap As New Bitmap(Kuvannimi)
Dim exif = sourceBitmap.GetPropertyItem(306).Value 'Tämä on tiedoston päiväys 306
Dim a As String = ""
For n = 0 To exif.Length - 1 ' Tämän kai voisi tehdä hienomminkin?
a = a + Chr(exif(n))
Next
Kuvausaika = Mid(a, 9, 2) + "/" + Mid(a, 6, 2) + "/" + Mid(a, 1, 4) + Mid(a, 11)
Try
' Katsotaan sitten olisiko Gps-tietoja?
exif = sourceBitmap.GetPropertyItem(2).Value 'Latitudi
Dim b() As Byte
b = exif
Naste = BitConverter.ToInt32(b, 0)
Nmin = BitConverter.ToInt32(b, 8)
Nsec = BitConverter.ToInt32(b, 16)
' Esimerkkiaineistossa on vain positiivisia astelukemia. Etelä lienee negatiivinen?
Naste = Naste + Nmin / 60 + Nsec / 100 / 3600 ' Jos halutaan asteina
exif = sourceBitmap.GetPropertyItem(4).Value 'Longitudi
b = exif
Easte = BitConverter.ToInt32(b, 0)
Emin = BitConverter.ToInt32(b, 8)
Esec = BitConverter.ToInt32(b, 16)
' Esimerkkiaineistossa on vain positiivisia astelukemia. Länsi lienee negatiivinen?
Easte = Easte + Emin / 60 + Esec / 100 / 3600 ' Jos halutaan asteina
Catch
' Kuvassa ei Gps-sijaintia
End TryTässä päivitetty koodi, joka näyttäisi toimivan myös läntisellä ja eteläisellä pallonpuoliskolla, ja myös muissa kameroissa kuin Samsungissa. Edelleen testiaineisto on valitettavan suppea, vain muutama kuva.
Laitoin eilen tuon yllä olevan koodin. Kun aloin tänään etsiä Googlella lisää tietoa, niin kuinka ollakaan tuo yllä oleva koodi oli heti ekana hakutuloksissa.
Dim Kuvannimi As String = "C:\Temp\img_1544.jpg"
Dim Kuvausaika As String = ""
Dim Naste As Single = 0
Dim Nmin As Single = 0
Dim Nsec As Single = 0
Dim Easte As Single = 0
Dim Emin As Single = 0
Dim Esec As Single = 0
Dim jakaja As Single
Dim NS, EW As Single
Dim Latitudi, Longitudi As Single
Dim GPSLatitudeRef, GPSLongitudeRef As String
Dim sourceBitmap As New Bitmap(Kuvannimi)
Dim exif = sourceBitmap.GetPropertyItem(306).Value 'Tämä on tiedoston päiväys 306
Dim a As String = ""
For n = 0 To exif.Length - 1 ' Tämän kai voisi tehdä hienomminkin?
a = a + Chr(exif(n))
Next
Kuvausaika = Mid(a, 9, 2) + "/" + Mid(a, 6, 2) + "/" + Mid(a, 1, 4) + Mid(a, 11)
Try
' Katsotaan sitten olisiko Gps-tietoja?
exif = sourceBitmap.GetPropertyItem(1).Value 'Pohj / Etelä?
GPSLatitudeRef = Chr(exif(0))
If GPSLatitudeRef = "N" Then
NS = 1
Else
NS = -1
End If
exif = sourceBitmap.GetPropertyItem(2).Value 'Latitudi
Dim b() As Byte
b = exif
Naste = BitConverter.ToInt32(b, 0)
jakaja = BitConverter.ToInt32(b, 4)
Naste = Naste / jakaja
Nmin = BitConverter.ToInt32(b, 8)
jakaja = BitConverter.ToInt32(b, 12)
Nmin = Nmin / jakaja
Nsec = BitConverter.ToInt32(b, 16)
jakaja = BitConverter.ToInt32(b, 20)
Nsec = Nsec / jakaja
' Asteiksi. Etelä negatiivinen
Latitudi = NS * (Naste + Nmin / 60 + Nsec / 3600)
exif = sourceBitmap.GetPropertyItem(3).Value 'Itä vai länsi
GPSLongitudeRef = Chr(exif(0))
If GPSLongitudeRef = "E" Then
EW = 1
Else
EW = -1
End If
exif = sourceBitmap.GetPropertyItem(4).Value 'Longitudi
b = exif
Easte = BitConverter.ToInt32(b, 0)
jakaja = BitConverter.ToInt32(b, 4)
Easte = Easte / jakaja
Emin = BitConverter.ToInt32(b, 8)
jakaja = BitConverter.ToInt32(b, 12)
Emin = Emin / jakaja
Esec = BitConverter.ToInt32(b, 16)
jakaja = BitConverter.ToInt32(b, 20)
Esec = Esec / jakaja
' Asteiksi. Länsi negatiivinen
Longitudi = EW * (Easte + Emin / 60 + Esec / 3600)
Catch
' Kuvassa ei Gps-sijaintia
End Try
End SubAihe on jo aika vanha, joten et voi enää vastata siihen.