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 Try
Tä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 Sub
Aihe on jo aika vanha, joten et voi enää vastata siihen.