summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWaltCuller <34122242+WaltCuller@users.noreply.github.com>2023-02-26 18:19:49 +0800
committerGitHub <noreply@github.com>2023-02-26 11:19:49 +0100
commit39cc3a2a7e5e1c04596a0424018ae9c84bb20b80 (patch)
tree5a849507ac5a857ebd49bbb94023dfab70ff9db9
parentce524d0b5ebaef05d29fa368465f31358f26dcda (diff)
exif: Return the proper exposure time value in some special cases
Return value in float64 if exposure time is int or greater than 1, otherwise return in fraction. Fixes #10738
-rw-r--r--resources/images/exif/exif.go7
-rw-r--r--resources/images/exif/exif_test.go180
-rw-r--r--resources/testdata/issue10738/canon_cr2_fraction.jpgbin0 -> 23024 bytes
-rw-r--r--resources/testdata/issue10738/canon_cr2_integer.jpgbin0 -> 20189 bytes
-rw-r--r--resources/testdata/issue10738/dji_dng_fraction.jpgbin0 -> 18991 bytes
-rw-r--r--resources/testdata/issue10738/fuji_raf_fraction.jpgbin0 -> 22653 bytes
-rw-r--r--resources/testdata/issue10738/fuji_raf_integer.jpgbin0 -> 20191 bytes
-rw-r--r--resources/testdata/issue10738/leica_dng_fraction.jpgbin0 -> 21145 bytes
-rw-r--r--resources/testdata/issue10738/lumix_rw2_fraction.jpgbin0 -> 22776 bytes
-rw-r--r--resources/testdata/issue10738/nikon_nef_d5600.jpgbin0 -> 20085 bytes
-rw-r--r--resources/testdata/issue10738/nikon_nef_fraction.jpgbin0 -> 20806 bytes
-rw-r--r--resources/testdata/issue10738/nikon_nef_fraction_2.jpgbin0 -> 100394 bytes
-rw-r--r--resources/testdata/issue10738/nikon_nef_integer.jpgbin0 -> 21903 bytes
-rw-r--r--resources/testdata/issue10738/sony_arw_fraction.jpgbin0 -> 23298 bytes
-rw-r--r--resources/testdata/issue10738/sony_arw_integer.jpgbin0 -> 23159 bytes
15 files changed, 184 insertions, 3 deletions
diff --git a/resources/images/exif/exif.go b/resources/images/exif/exif.go
index 8df348b23..90198eeed 100644
--- a/resources/images/exif/exif.go
+++ b/resources/images/exif/exif.go
@@ -173,11 +173,12 @@ func decodeTag(x *_exif.Exif, f _exif.FieldName, t *tiff.Tag) (any, error) {
case tiff.RatVal:
n, d, _ := t.Rat2(i)
rat := big.NewRat(n, d)
- if n == 1 {
- rv = append(rv, rat)
- } else {
+ // if t is int or t > 1, use float64
+ if rat.IsInt() || rat.Cmp(big.NewRat(1, 1)) == 1 {
f, _ := rat.Float64()
rv = append(rv, f)
+ } else {
+ rv = append(rv, rat)
}
case tiff.FloatVal:
diff --git a/resources/images/exif/exif_test.go b/resources/images/exif/exif_test.go
index cd5961404..821367550 100644
--- a/resources/images/exif/exif_test.go
+++ b/resources/images/exif/exif_test.go
@@ -133,3 +133,183 @@ var eq = qt.CmpEquals(
return v1.Unix() == v2.Unix()
}),
)
+
+func TestIssue10738(t *testing.T) {
+
+ c := qt.New(t)
+
+ testFunc := func(path, include string) any {
+ f, err := os.Open(filepath.FromSlash(path))
+ c.Assert(err, qt.IsNil)
+ defer f.Close()
+
+ d, err := NewDecoder(IncludeFields(include))
+ c.Assert(err, qt.IsNil)
+ x, err := d.Decode(f)
+ c.Assert(err, qt.IsNil)
+
+ // Verify that it survives a round-trip to JSON and back.
+ data, err := json.Marshal(x)
+ c.Assert(err, qt.IsNil)
+ x2 := &ExifInfo{}
+ err = json.Unmarshal(data, x2)
+
+ c.Assert(x2, eq, x)
+
+ v, found := x.Tags["ExposureTime"]
+ c.Assert(found, qt.Equals, true)
+ return v
+ }
+
+ type args struct {
+ path string // imagePath
+ include string // includeFields
+ }
+
+ type want struct {
+ vN int64 // numerator
+ vD int64 // denominator
+ }
+
+ type testCase struct {
+ name string
+ args args
+ want want
+ }
+
+ tests := []testCase{
+ {
+ "canon_cr2_fraction", args{
+ path: "../../testdata/issue10738/canon_cr2_fraction.jpg",
+ include: "Lens|Date|ExposureTime",
+ }, want{
+ 1,
+ 500,
+ },
+ },
+ {
+ "canon_cr2_integer", args{
+ path: "../../testdata/issue10738/canon_cr2_integer.jpg",
+ include: "Lens|Date|ExposureTime",
+ }, want{
+ 10,
+ 0,
+ },
+ },
+ {
+ "dji_dng_fraction", args{
+ path: "../../testdata/issue10738/dji_dng_fraction.jpg",
+ include: "Lens|Date|ExposureTime",
+ }, want{
+ 1,
+ 4000,
+ },
+ },
+ {
+ "fuji_raf_fraction", args{
+ path: "../../testdata/issue10738/fuji_raf_fraction.jpg",
+ include: "Lens|Date|ExposureTime",
+ }, want{
+ 1,
+ 250,
+ },
+ },
+ {
+ "fuji_raf_integer", args{
+ path: "../../testdata/issue10738/fuji_raf_integer.jpg",
+ include: "Lens|Date|ExposureTime",
+ }, want{
+ 1,
+ 0,
+ },
+ },
+ {
+ "leica_dng_fraction", args{
+ path: "../../testdata/issue10738/leica_dng_fraction.jpg",
+ include: "Lens|Date|ExposureTime",
+ }, want{
+ 1,
+ 100,
+ },
+ },
+ {
+ "lumix_rw2_fraction", args{
+ path: "../../testdata/issue10738/lumix_rw2_fraction.jpg",
+ include: "Lens|Date|ExposureTime",
+ }, want{
+ 1,
+ 400,
+ },
+ },
+ {
+ "nikon_nef_d5600", args{
+ path: "../../testdata/issue10738/nikon_nef_d5600.jpg",
+ include: "Lens|Date|ExposureTime",
+ }, want{
+ 1,
+ 1000,
+ },
+ },
+ {
+ "nikon_nef_fraction", args{
+ path: "../../testdata/issue10738/nikon_nef_fraction.jpg",
+ include: "Lens|Date|ExposureTime",
+ }, want{
+ 1,
+ 640,
+ },
+ },
+ {
+ "nikon_nef_integer", args{
+ path: "../../testdata/issue10738/nikon_nef_integer.jpg",
+ include: "Lens|Date|ExposureTime",
+ }, want{
+ 30,
+ 0,
+ },
+ },
+ {
+ "nikon_nef_fraction_2", args{
+ path: "../../testdata/issue10738/nikon_nef_fraction_2.jpg",
+ include: "Lens|Date|ExposureTime",
+ }, want{
+ 1,
+ 6400,
+ },
+ },
+ {
+ "sony_arw_fraction", args{
+ path: "../../testdata/issue10738/sony_arw_fraction.jpg",
+ include: "Lens|Date|ExposureTime",
+ }, want{
+ 1,
+ 160,
+ },
+ },
+ {
+ "sony_arw_integer", args{
+ path: "../../testdata/issue10738/sony_arw_integer.jpg",
+ include: "Lens|Date|ExposureTime",
+ }, want{
+ 4,
+ 0,
+ },
+ },
+ }
+
+ for _, tt := range tests {
+ c.Run(tt.name, func(c *qt.C) {
+ got := testFunc(tt.args.path, tt.args.include)
+ switch got.(type) {
+ case float64:
+ eTime, ok := got.(float64)
+ c.Assert(ok, qt.Equals, true)
+ c.Assert(eTime, qt.Equals, float64(tt.want.vN))
+ case *big.Rat:
+ eTime, ok := got.(*big.Rat)
+ c.Assert(ok, qt.Equals, true)
+ c.Assert(eTime, eq, big.NewRat(tt.want.vN, tt.want.vD))
+ }
+ })
+ }
+}
diff --git a/resources/testdata/issue10738/canon_cr2_fraction.jpg b/resources/testdata/issue10738/canon_cr2_fraction.jpg
new file mode 100644
index 000000000..4ee6a23e9
--- /dev/null
+++ b/resources/testdata/issue10738/canon_cr2_fraction.jpg
Binary files differ
diff --git a/resources/testdata/issue10738/canon_cr2_integer.jpg b/resources/testdata/issue10738/canon_cr2_integer.jpg
new file mode 100644
index 000000000..145a9935d
--- /dev/null
+++ b/resources/testdata/issue10738/canon_cr2_integer.jpg
Binary files differ
diff --git a/resources/testdata/issue10738/dji_dng_fraction.jpg b/resources/testdata/issue10738/dji_dng_fraction.jpg
new file mode 100644
index 000000000..fdbad4aaf
--- /dev/null
+++ b/resources/testdata/issue10738/dji_dng_fraction.jpg
Binary files differ
diff --git a/resources/testdata/issue10738/fuji_raf_fraction.jpg b/resources/testdata/issue10738/fuji_raf_fraction.jpg
new file mode 100644
index 000000000..1a588229e
--- /dev/null
+++ b/resources/testdata/issue10738/fuji_raf_fraction.jpg
Binary files differ
diff --git a/resources/testdata/issue10738/fuji_raf_integer.jpg b/resources/testdata/issue10738/fuji_raf_integer.jpg
new file mode 100644
index 000000000..3902be379
--- /dev/null
+++ b/resources/testdata/issue10738/fuji_raf_integer.jpg
Binary files differ
diff --git a/resources/testdata/issue10738/leica_dng_fraction.jpg b/resources/testdata/issue10738/leica_dng_fraction.jpg
new file mode 100644
index 000000000..a1ccf452e
--- /dev/null
+++ b/resources/testdata/issue10738/leica_dng_fraction.jpg
Binary files differ
diff --git a/resources/testdata/issue10738/lumix_rw2_fraction.jpg b/resources/testdata/issue10738/lumix_rw2_fraction.jpg
new file mode 100644
index 000000000..5da5943d6
--- /dev/null
+++ b/resources/testdata/issue10738/lumix_rw2_fraction.jpg
Binary files differ
diff --git a/resources/testdata/issue10738/nikon_nef_d5600.jpg b/resources/testdata/issue10738/nikon_nef_d5600.jpg
new file mode 100644
index 000000000..26d791f39
--- /dev/null
+++ b/resources/testdata/issue10738/nikon_nef_d5600.jpg
Binary files differ
diff --git a/resources/testdata/issue10738/nikon_nef_fraction.jpg b/resources/testdata/issue10738/nikon_nef_fraction.jpg
new file mode 100644
index 000000000..535addad1
--- /dev/null
+++ b/resources/testdata/issue10738/nikon_nef_fraction.jpg
Binary files differ
diff --git a/resources/testdata/issue10738/nikon_nef_fraction_2.jpg b/resources/testdata/issue10738/nikon_nef_fraction_2.jpg
new file mode 100644
index 000000000..15d9bda92
--- /dev/null
+++ b/resources/testdata/issue10738/nikon_nef_fraction_2.jpg
Binary files differ
diff --git a/resources/testdata/issue10738/nikon_nef_integer.jpg b/resources/testdata/issue10738/nikon_nef_integer.jpg
new file mode 100644
index 000000000..00a880511
--- /dev/null
+++ b/resources/testdata/issue10738/nikon_nef_integer.jpg
Binary files differ
diff --git a/resources/testdata/issue10738/sony_arw_fraction.jpg b/resources/testdata/issue10738/sony_arw_fraction.jpg
new file mode 100644
index 000000000..6550b5d39
--- /dev/null
+++ b/resources/testdata/issue10738/sony_arw_fraction.jpg
Binary files differ
diff --git a/resources/testdata/issue10738/sony_arw_integer.jpg b/resources/testdata/issue10738/sony_arw_integer.jpg
new file mode 100644
index 000000000..8548c0a18
--- /dev/null
+++ b/resources/testdata/issue10738/sony_arw_integer.jpg
Binary files differ