1
Fork 0

Sanitize float values in EXIF fields

Read exposure as rational in EXIF internal parser
This commit is contained in:
Dhole 2021-05-18 23:48:48 +02:00
parent 1791ef1b5c
commit 3de9282fba
4 changed files with 45 additions and 3 deletions

View File

@ -2,6 +2,7 @@ package exif
import (
"log"
"math"
"time"
"github.com/barasher/go-exiftool"
@ -28,6 +29,38 @@ func newExiftoolParser() (*externalExifParser, error) {
}, nil
}
// isFloatReal returns true when the float value represents a real number
// (different than +Inf, -Inf or NaN)
func isFloatReal(v float64) bool {
if math.IsInf(v, 1) {
return false
} else if math.IsInf(v, -1) {
return false
} else if math.IsNaN(v) {
return false
}
return true
}
// sanitizeEXIF removes any EXIF float64 field that is not a real number (+Inf,
// -Inf or Nan)
func sanitizeEXIF(exif *models.MediaEXIF) {
if exif.Exposure != nil && !isFloatReal(*exif.Exposure) {
exif.Exposure = nil
}
if exif.Aperture != nil && !isFloatReal(*exif.Aperture) {
exif.Aperture = nil
}
if exif.FocalLength != nil && !isFloatReal(*exif.FocalLength) {
exif.FocalLength = nil
}
if (exif.GPSLatitude != nil && !isFloatReal(*exif.GPSLatitude)) ||
(exif.GPSLongitude != nil && !isFloatReal(*exif.GPSLongitude)) {
exif.GPSLatitude = nil
exif.GPSLongitude = nil
}
}
func (p *externalExifParser) ParseExif(media_path string) (returnExif *models.MediaEXIF, returnErr error) {
// ExifTool - No print conversion mode
if p.et == nil {
@ -148,5 +181,6 @@ func (p *externalExifParser) ParseExif(media_path string) (returnExif *models.Me
}
returnExif = &newExif
sanitizeEXIF(returnExif)
return
}

View File

@ -62,11 +62,12 @@ func (p *internalExifParser) ParseExif(media_path string) (returnExif *models.Me
newExif.DateShot = &date_utc
}
exposure, err := exifTags.Get(exif.ExposureTime)
exposureTag, err := exifTags.Get(exif.ExposureTime)
if err == nil {
exposureFloat, err := exposure.Float(0)
exposureRat, err := exposureTag.Rat(0)
if err == nil {
newExif.Exposure = &exposureFloat
exposure, _ := exposureRat.Float64()
newExif.Exposure = &exposure
}
}

View File

@ -51,6 +51,7 @@ func TestExifParsers(t *testing.T) {
assert.EqualValues(t, *exif.Camera, "Canon EOS 600D")
assert.EqualValues(t, *exif.Maker, "Canon")
assert.WithinDuration(t, *exif.DateShot, time.Unix(1336318784, 0).UTC(), time.Minute)
assert.InDelta(t, *exif.Exposure, 1.0/4000.0, 0.0001)
assert.EqualValues(t, *exif.Aperture, 6.3)
assert.EqualValues(t, *exif.Iso, 800)
assert.EqualValues(t, *exif.FocalLength, 300)
@ -66,6 +67,12 @@ func TestExifParsers(t *testing.T) {
assert.Nil(t, exif)
},
},
{
path: "./test_data/bad-exif.jpg",
assert: func(t *testing.T, exif *models.MediaEXIF) {
assert.Nil(t, exif.Exposure)
},
},
}
for _, p := range parsers {

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB