exif: Return the proper exposure time value in some special cases - hugo - [fork] hugo port for 9front
HTML git clone git@git.drkhsh.at/hugo.git
DIR Log
DIR Files
DIR Refs
DIR Submodules
DIR README
DIR LICENSE
---
DIR commit 39cc3a2a7e5e1c04596a0424018ae9c84bb20b80
DIR parent ce524d0b5ebaef05d29fa368465f31358f26dcda
HTML Author: WaltCuller <34122242+WaltCuller@users.noreply.github.com>
Date: Sun, 26 Feb 2023 18:19:49 +0800
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
Diffstat:
M resources/images/exif/exif.go | 7 ++++---
M resources/images/exif/exif_test.go | 180 +++++++++++++++++++++++++++++++
A resources/testdata/issue10738/cano… | 0
A resources/testdata/issue10738/cano… | 0
A resources/testdata/issue10738/dji_… | 0
A resources/testdata/issue10738/fuji… | 0
A resources/testdata/issue10738/fuji… | 0
A resources/testdata/issue10738/leic… | 0
A resources/testdata/issue10738/lumi… | 0
A resources/testdata/issue10738/niko… | 0
A resources/testdata/issue10738/niko… | 0
A resources/testdata/issue10738/niko… | 0
A resources/testdata/issue10738/niko… | 0
A resources/testdata/issue10738/sony… | 0
A resources/testdata/issue10738/sony… | 0
15 files changed, 184 insertions(+), 3 deletions(-)
---
DIR diff --git 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:
DIR diff --git 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))
+ }
+ })
+ }
+}
DIR diff --git a/resources/testdata/issue10738/canon_cr2_fraction.jpg b/resources/testdata/issue10738/canon_cr2_fraction.jpg
Binary files differ.
DIR diff --git a/resources/testdata/issue10738/canon_cr2_integer.jpg b/resources/testdata/issue10738/canon_cr2_integer.jpg
Binary files differ.
DIR diff --git a/resources/testdata/issue10738/dji_dng_fraction.jpg b/resources/testdata/issue10738/dji_dng_fraction.jpg
Binary files differ.
DIR diff --git a/resources/testdata/issue10738/fuji_raf_fraction.jpg b/resources/testdata/issue10738/fuji_raf_fraction.jpg
Binary files differ.
DIR diff --git a/resources/testdata/issue10738/fuji_raf_integer.jpg b/resources/testdata/issue10738/fuji_raf_integer.jpg
Binary files differ.
DIR diff --git a/resources/testdata/issue10738/leica_dng_fraction.jpg b/resources/testdata/issue10738/leica_dng_fraction.jpg
Binary files differ.
DIR diff --git a/resources/testdata/issue10738/lumix_rw2_fraction.jpg b/resources/testdata/issue10738/lumix_rw2_fraction.jpg
Binary files differ.
DIR diff --git a/resources/testdata/issue10738/nikon_nef_d5600.jpg b/resources/testdata/issue10738/nikon_nef_d5600.jpg
Binary files differ.
DIR diff --git a/resources/testdata/issue10738/nikon_nef_fraction.jpg b/resources/testdata/issue10738/nikon_nef_fraction.jpg
Binary files differ.
DIR diff --git a/resources/testdata/issue10738/nikon_nef_fraction_2.jpg b/resources/testdata/issue10738/nikon_nef_fraction_2.jpg
Binary files differ.
DIR diff --git a/resources/testdata/issue10738/nikon_nef_integer.jpg b/resources/testdata/issue10738/nikon_nef_integer.jpg
Binary files differ.
DIR diff --git a/resources/testdata/issue10738/sony_arw_fraction.jpg b/resources/testdata/issue10738/sony_arw_fraction.jpg
Binary files differ.
DIR diff --git a/resources/testdata/issue10738/sony_arw_integer.jpg b/resources/testdata/issue10738/sony_arw_integer.jpg
Binary files differ.