Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB.NET: [vb2008] Valokuvan Gps-sijainti ja exif

AimoKulaus [18.11.2009 19:30:21]

#

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

AimoKulaus [19.11.2009 18:05:25]

#

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

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta