diff --git a/PIL/JpegImagePlugin.py b/PIL/JpegImagePlugin.py index 5cae90073..7cb280764 100644 --- a/PIL/JpegImagePlugin.py +++ b/PIL/JpegImagePlugin.py @@ -37,6 +37,7 @@ __version__ = "0.6" import array import struct import io +import warnings from struct import unpack from PIL import Image, ImageFile, TiffImagePlugin, _binary from PIL.JpegPresets import presets @@ -713,8 +714,8 @@ def _save_cjpeg(im, fp, filename): # Factory for making JPEG and MPO instances def jpeg_factory(fp=None, filename=None): im = JpegImageFile(fp, filename) - mpheader = im._getmp() try: + mpheader = im._getmp() if mpheader[45057] > 1: # It's actually an MPO from .MpoImagePlugin import MpoImageFile @@ -722,6 +723,10 @@ def jpeg_factory(fp=None, filename=None): except (TypeError, IndexError): # It is really a JPEG pass + except SyntaxError: + warnings.warn("Image appears to be a malformed MPO file, it will be " + "interpreted as a base JPEG file") + pass return im diff --git a/Tests/images/bad_mpo_header.jpg b/Tests/images/bad_mpo_header.jpg new file mode 100644 index 000000000..c7750cbe4 Binary files /dev/null and b/Tests/images/bad_mpo_header.jpg differ diff --git a/Tests/test_file_jpeg.py b/Tests/test_file_jpeg.py index bb2d7b61e..8e815da8b 100644 --- a/Tests/test_file_jpeg.py +++ b/Tests/test_file_jpeg.py @@ -353,6 +353,17 @@ class TestFileJpeg(PillowTestCase): reloaded.save(f, quality='keep', progressive=True) reloaded.save(f, quality='keep', optimize=True) + def test_bad_mpo_header(self): + """ Treat unknown MPO as JPEG """ + # Arrange + + # Act + # Shouldn't raise error + im = Image.open("Tests/images/bad_mpo_header.jpg") + + # Assert + self.assertEqual(im.format, "JPEG") + if __name__ == '__main__': unittest.main()