diff --git a/Tests/images/exif.png b/Tests/images/exif.png new file mode 100644 index 000000000..0388b6b8a Binary files /dev/null and b/Tests/images/exif.png differ diff --git a/Tests/test_file_png.py b/Tests/test_file_png.py index 0e912c1ee..c2864d223 100644 --- a/Tests/test_file_png.py +++ b/Tests/test_file_png.py @@ -591,6 +591,21 @@ class TestFilePng(PillowTestCase): self.assertEqual(im.text, {'TXT': 'VALUE', 'ZIP': 'VALUE'}) def test_exif(self): + im = Image.open("Tests/images/exif.png") + exif = im._getexif() + self.assertEqual(exif[274], 1) + + def test_exif_save(self): + im = Image.open("Tests/images/exif.png") + + test_file = self.tempfile("temp.png") + im.save(test_file) + + reloaded = Image.open(test_file) + exif = reloaded._getexif() + self.assertEqual(exif[274], 1) + + def test_exif_from_jpg(self): im = Image.open("Tests/images/pil_sample_rgb.jpg") test_file = self.tempfile("temp.png") diff --git a/docs/handbook/image-file-formats.rst b/docs/handbook/image-file-formats.rst index 8f53291c3..663b740d5 100644 --- a/docs/handbook/image-file-formats.rst +++ b/docs/handbook/image-file-formats.rst @@ -462,6 +462,10 @@ PNG Pillow identifies, reads, and writes PNG files containing ``1``, ``L``, ``P``, ``RGB``, or ``RGBA`` data. Interlaced files are supported as of v1.1.7. +As of Pillow 6.0, EXIF data can be read from PNG images. However, unlike other +image formats, EXIF data is not guaranteed to have been read until +:py:meth:`~PIL.Image.Image.load` has been called. + The :py:meth:`~PIL.Image.Image.open` method sets the following :py:attr:`~PIL.Image.Image.info` properties, when appropriate: @@ -527,6 +531,11 @@ The :py:meth:`~PIL.Image.Image.save` method supports the following options: **icc_profile** The ICC Profile to include in the saved file. +**exif** + The exif data to include in the saved file. + + .. versionadded:: 6.0.0 + **bits (experimental)** For ``P`` images, this option controls how many bits to store. If omitted, the PNG writer uses 8 bits (256 colors). diff --git a/docs/releasenotes/6.0.0.rst b/docs/releasenotes/6.0.0.rst index 09b96939c..58586f3bb 100644 --- a/docs/releasenotes/6.0.0.rst +++ b/docs/releasenotes/6.0.0.rst @@ -112,6 +112,13 @@ Image.quantize The `dither` option is now a customisable parameter (was previously hardcoded to `1`). This parameter takes the same values used in `Image.convert` +PNG EXIF Data +^^^^^^^^^^^^^ + +EXIF data can now be read from and saved to PNG images. However, unlike other image +formats, EXIF data is not guaranteed to have been read until +:py:meth:`~PIL.Image.Image.load` has been called. + Other Changes ============= diff --git a/src/PIL/PngImagePlugin.py b/src/PIL/PngImagePlugin.py index 2145e8ca7..df632af1d 100644 --- a/src/PIL/PngImagePlugin.py +++ b/src/PIL/PngImagePlugin.py @@ -689,6 +689,8 @@ class PngImageFile(ImageFile.ImageFile): self.png = None def _getexif(self): + if "exif" not in self.info: + self.load() from .JpegImagePlugin import _getexif return _getexif(self)