diff --git a/v2/assets/gps-2200-scaled.jpg b/v2/assets/gps-2200-scaled.jpg new file mode 100644 index 0000000..b8fe317 Binary files /dev/null and b/v2/assets/gps-2200-scaled.jpg differ diff --git a/v2/ifd_enumerate.go b/v2/ifd_enumerate.go index d229ef8..ac43c9b 100644 --- a/v2/ifd_enumerate.go +++ b/v2/ifd_enumerate.go @@ -28,6 +28,19 @@ var ( var ( ValidGpsVersions = [][4]byte{ + // 2.0.0.0 appears to have a very similar format to 2.2.0.0, so enabling + // it under that assumption. + // + // IFD-PATH=[IFD] ID=(0x8825) NAME=[GPSTag] COUNT=(1) TYPE=[LONG] VALUE=[114] + // IFD-PATH=[IFD/GPSInfo] ID=(0x0000) NAME=[GPSVersionID] COUNT=(4) TYPE=[BYTE] VALUE=[02 00 00 00] + // IFD-PATH=[IFD/GPSInfo] ID=(0x0001) NAME=[GPSLatitudeRef] COUNT=(2) TYPE=[ASCII] VALUE=[S] + // IFD-PATH=[IFD/GPSInfo] ID=(0x0002) NAME=[GPSLatitude] COUNT=(3) TYPE=[RATIONAL] VALUE=[38/1...] + // IFD-PATH=[IFD/GPSInfo] ID=(0x0003) NAME=[GPSLongitudeRef] COUNT=(2) TYPE=[ASCII] VALUE=[E] + // IFD-PATH=[IFD/GPSInfo] ID=(0x0004) NAME=[GPSLongitude] COUNT=(3) TYPE=[RATIONAL] VALUE=[144/1...] + // IFD-PATH=[IFD/GPSInfo] ID=(0x0012) NAME=[GPSMapDatum] COUNT=(7) TYPE=[ASCII] VALUE=[WGS-84] + // + {2, 0, 0, 0}, + {2, 2, 0, 0}, // Suddenly appeared at the default in 2.31: https://home.jeita.or.jp/tsc/std-pdf/CP-3451D.pdf diff --git a/v2/ifd_enumerate_test.go b/v2/ifd_enumerate_test.go index 598f48b..d551411 100644 --- a/v2/ifd_enumerate_test.go +++ b/v2/ifd_enumerate_test.go @@ -269,6 +269,61 @@ func TestIfd_GpsInfo(t *testing.T) { } } +func TestIfd_GpsInfo__2_0_0_0(t *testing.T) { + defer func() { + if state := recover(); state != nil { + err := log.Wrap(state.(error)) + log.PrintErrorf(err, "Test failure.") + } + }() + + assetsPath := getTestAssetsPath() + filepath := path.Join(assetsPath, "gps-2200-scaled.jpg") + + rawExif, err := SearchFileAndExtractExif(filepath) + log.PanicIf(err) + + im := NewIfdMapping() + + err = LoadStandardIfds(im) + log.PanicIf(err) + + ti := NewTagIndex() + + _, index, err := Collect(im, ti, rawExif) + log.PanicIf(err) + + ifd, err := index.RootIfd.ChildWithIfdPath(exifcommon.IfdPathStandardGps) + log.PanicIf(err) + + gi, err := ifd.GpsInfo() + log.PanicIf(err) + + expectedLatitude := GpsDegrees{ + Orientation: 'S', + Degrees: 38.0, + Minutes: 24.311687, + Seconds: 0.0, + } + + expectedLongitude := GpsDegrees{ + Orientation: 'E', + Degrees: 144.0, + Minutes: 11.33748, + Seconds: 0.0, + } + + if GpsDegreesEquals(gi.Latitude, expectedLatitude) != true { + t.Fatalf("Latitude not correct: %v", gi.Latitude) + } else if GpsDegreesEquals(gi.Longitude, expectedLongitude) != true { + t.Fatalf("Longitude not correct: %v", gi.Longitude) + } else if gi.Altitude != 0 { + t.Fatalf("Altitude not correct: (%d)", gi.Altitude) + } else if gi.Timestamp.Unix() != -62135596800 { + t.Fatalf("Timestamp not correct: (%d)", gi.Timestamp.Unix()) + } +} + func TestIfd_EnumerateTagsRecursively(t *testing.T) { testImageFilepath := getTestImageFilepath()