]> git.maquefel.me Git - brevno-suite/hugo/commitdiff
exif: Return the proper exposure time value in some special cases
authorWaltCuller <34122242+WaltCuller@users.noreply.github.com>
Sun, 26 Feb 2023 10:19:49 +0000 (18:19 +0800)
committerGitHub <noreply@github.com>
Sun, 26 Feb 2023 10:19:49 +0000 (11:19 +0100)
Return value in float64 if exposure time is int or greater than 1, otherwise return in fraction.

Fixes #10738

15 files changed:
resources/images/exif/exif.go
resources/images/exif/exif_test.go
resources/testdata/issue10738/canon_cr2_fraction.jpg [new file with mode: 0644]
resources/testdata/issue10738/canon_cr2_integer.jpg [new file with mode: 0644]
resources/testdata/issue10738/dji_dng_fraction.jpg [new file with mode: 0644]
resources/testdata/issue10738/fuji_raf_fraction.jpg [new file with mode: 0644]
resources/testdata/issue10738/fuji_raf_integer.jpg [new file with mode: 0644]
resources/testdata/issue10738/leica_dng_fraction.jpg [new file with mode: 0644]
resources/testdata/issue10738/lumix_rw2_fraction.jpg [new file with mode: 0644]
resources/testdata/issue10738/nikon_nef_d5600.jpg [new file with mode: 0644]
resources/testdata/issue10738/nikon_nef_fraction.jpg [new file with mode: 0644]
resources/testdata/issue10738/nikon_nef_fraction_2.jpg [new file with mode: 0644]
resources/testdata/issue10738/nikon_nef_integer.jpg [new file with mode: 0644]
resources/testdata/issue10738/sony_arw_fraction.jpg [new file with mode: 0644]
resources/testdata/issue10738/sony_arw_integer.jpg [new file with mode: 0644]

index 8df348b23dad0decfc549a8aa3df4317a00f9a50..90198eeed5957225046514d5534fd39f08d3f3e2 100644 (file)
@@ -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:
index cd5961404296089dd13619c995b157cf5a0ec4eb..821367550861b941169331201fa218c798683220 100644 (file)
@@ -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 (file)
index 0000000..4ee6a23
Binary files /dev/null and b/resources/testdata/issue10738/canon_cr2_fraction.jpg differ
diff --git a/resources/testdata/issue10738/canon_cr2_integer.jpg b/resources/testdata/issue10738/canon_cr2_integer.jpg
new file mode 100644 (file)
index 0000000..145a993
Binary files /dev/null and b/resources/testdata/issue10738/canon_cr2_integer.jpg differ
diff --git a/resources/testdata/issue10738/dji_dng_fraction.jpg b/resources/testdata/issue10738/dji_dng_fraction.jpg
new file mode 100644 (file)
index 0000000..fdbad4a
Binary files /dev/null and b/resources/testdata/issue10738/dji_dng_fraction.jpg differ
diff --git a/resources/testdata/issue10738/fuji_raf_fraction.jpg b/resources/testdata/issue10738/fuji_raf_fraction.jpg
new file mode 100644 (file)
index 0000000..1a58822
Binary files /dev/null and b/resources/testdata/issue10738/fuji_raf_fraction.jpg differ
diff --git a/resources/testdata/issue10738/fuji_raf_integer.jpg b/resources/testdata/issue10738/fuji_raf_integer.jpg
new file mode 100644 (file)
index 0000000..3902be3
Binary files /dev/null and b/resources/testdata/issue10738/fuji_raf_integer.jpg differ
diff --git a/resources/testdata/issue10738/leica_dng_fraction.jpg b/resources/testdata/issue10738/leica_dng_fraction.jpg
new file mode 100644 (file)
index 0000000..a1ccf45
Binary files /dev/null and b/resources/testdata/issue10738/leica_dng_fraction.jpg differ
diff --git a/resources/testdata/issue10738/lumix_rw2_fraction.jpg b/resources/testdata/issue10738/lumix_rw2_fraction.jpg
new file mode 100644 (file)
index 0000000..5da5943
Binary files /dev/null and b/resources/testdata/issue10738/lumix_rw2_fraction.jpg differ
diff --git a/resources/testdata/issue10738/nikon_nef_d5600.jpg b/resources/testdata/issue10738/nikon_nef_d5600.jpg
new file mode 100644 (file)
index 0000000..26d791f
Binary files /dev/null and b/resources/testdata/issue10738/nikon_nef_d5600.jpg differ
diff --git a/resources/testdata/issue10738/nikon_nef_fraction.jpg b/resources/testdata/issue10738/nikon_nef_fraction.jpg
new file mode 100644 (file)
index 0000000..535adda
Binary files /dev/null and b/resources/testdata/issue10738/nikon_nef_fraction.jpg 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 (file)
index 0000000..15d9bda
Binary files /dev/null and b/resources/testdata/issue10738/nikon_nef_fraction_2.jpg differ
diff --git a/resources/testdata/issue10738/nikon_nef_integer.jpg b/resources/testdata/issue10738/nikon_nef_integer.jpg
new file mode 100644 (file)
index 0000000..00a8805
Binary files /dev/null and b/resources/testdata/issue10738/nikon_nef_integer.jpg differ
diff --git a/resources/testdata/issue10738/sony_arw_fraction.jpg b/resources/testdata/issue10738/sony_arw_fraction.jpg
new file mode 100644 (file)
index 0000000..6550b5d
Binary files /dev/null and b/resources/testdata/issue10738/sony_arw_fraction.jpg differ
diff --git a/resources/testdata/issue10738/sony_arw_integer.jpg b/resources/testdata/issue10738/sony_arw_integer.jpg
new file mode 100644 (file)
index 0000000..8548c0a
Binary files /dev/null and b/resources/testdata/issue10738/sony_arw_integer.jpg differ