From: Vladimír Vondruš Date: Mon, 11 Dec 2017 15:09:46 +0000 (+0100) Subject: m.images: gracefully handle sparse EXIF info in image grid. X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~cjwatson/git?a=commitdiff_plain;h=92e90ca7c97fe75b09046457dda1b9980fd8aed7;p=blog.git m.images: gracefully handle sparse EXIF info in image grid. And document EXIF modification for future self. --- diff --git a/pelican-plugins/m/images.py b/pelican-plugins/m/images.py index 168bb930..2ebc16db 100644 --- a/pelican-plugins/m/images.py +++ b/pelican-plugins/m/images.py @@ -191,8 +191,16 @@ class ImageGrid(rst.Directive): for k, v in im._getexif().items() if k in PIL.ExifTags.TAGS and len(str(v)) < 256 } - # Can't use just *exif['ExposureTime'] on Py3.4 - caption = "F{}, {}/{} s, ISO {}".format(float(exif['FNumber'][0])/float(exif['FNumber'][1]), exif['ExposureTime'][0], exif['ExposureTime'][1], exif['ISOSpeedRatings']) + + # Not all info might be present + caption = [] + if 'FNumber' in exif: + caption += ["F{}".format(float(float(exif['FNumber'][0])/float(exif['FNumber'][1])))] + if 'ExposureTime' in exif: + caption += ["{}/{} s".format(exif['ExposureTime'][0], exif['ExposureTime'][1])] + if 'ISOSpeedRatings' in exif: + caption += ["ISO {}".format(exif['ISOSpeedRatings'])] + caption = ', '.join(caption) # It's not (e.g. a PNG file), empty caption else: caption = "" diff --git a/pelican-plugins/m/test/images/page.html b/pelican-plugins/m/test/images/page.html index 40fc9b26..abf048f5 100644 --- a/pelican-plugins/m/test/images/page.html +++ b/pelican-plugins/m/test/images/page.html @@ -82,14 +82,18 @@ Yes. -

Image grid with a PNG file:

+

Image grid with a PNG file and a JPEG with sparse EXIF data:

-
+
+
+
F2.8
+
+
diff --git a/pelican-plugins/m/test/images/page.rst b/pelican-plugins/m/test/images/page.rst index 2cc494f1..13fe99aa 100644 --- a/pelican-plugins/m/test/images/page.rst +++ b/pelican-plugins/m/test/images/page.rst @@ -57,8 +57,9 @@ Image grid: {filename}/flowers.jpg {filename}/ship.jpg -Image grid with a PNG file: +Image grid with a PNG file and a JPEG with sparse EXIF data: .. image-grid:: {filename}/tiny.png + {filename}/sparseexif.jpg diff --git a/pelican-plugins/m/test/images/sparseexif.jpg b/pelican-plugins/m/test/images/sparseexif.jpg new file mode 100644 index 00000000..19044d3b Binary files /dev/null and b/pelican-plugins/m/test/images/sparseexif.jpg differ diff --git a/pelican-plugins/m/test/test_images.py b/pelican-plugins/m/test/test_images.py index c3bbc644..699e1f09 100644 --- a/pelican-plugins/m/test/test_images.py +++ b/pelican-plugins/m/test/test_images.py @@ -31,7 +31,17 @@ class Images(PluginTestCase): def test(self): self.run_pelican({ 'PLUGINS': ['m.htmlsanity', 'm.images'], - 'STATIC_PATHS': ['tiny.png', 'ship.jpg', 'flowers.jpg'] + 'STATIC_PATHS': ['tiny.png', 'ship.jpg', 'flowers.jpg', 'sparseexif.jpg'] }) + # + # Modifying EXIF in files for testing: + # + # # Prints out all EXIF info + # identify -format '%[EXIF:*]' file.jpg + # + # # Removes *everything* and adds a new value (order is important) + # exiftool -all= -exif:FNumber=28/10 file.jpg + # + self.assertEqual(*self.actual_expected_contents('page.html'))