diff --git a/Tests/test_image_mode.py b/Tests/test_image_mode.py index 345c0dacb4b..bdfb6883b76 100644 --- a/Tests/test_image_mode.py +++ b/Tests/test_image_mode.py @@ -26,6 +26,17 @@ def test_sanity(self): self.assertEqual(m.basemode, "L") self.assertEqual(m.basetype, "L") + for mode in ("I;16", "I;16S", + "I;16L", "I;16LS", + "I;16B", "I;16BS", + "I;16N", "I;16NS"): + m = ImageMode.getmode(mode) + self.assertEqual(m.mode, mode) + self.assertEqual(str(m), mode) + self.assertEqual(m.bands, ("I",)) + self.assertEqual(m.basemode, "L") + self.assertEqual(m.basetype, "L") + m = ImageMode.getmode("RGB") self.assertEqual(m.mode, "RGB") self.assertEqual(str(m), "RGB") diff --git a/Tests/test_imageshow.py b/Tests/test_imageshow.py index 899c057d6f7..a2b02810ec7 100644 --- a/Tests/test_imageshow.py +++ b/Tests/test_imageshow.py @@ -18,18 +18,19 @@ def test_register(self): ImageShow._viewers.pop() def test_show(self): - class TestViewer: + class TestViewer(ImageShow.Viewer): methodCalled = False - def show(self, image, title=None, **options): + def show_image(self, image, **options): self.methodCalled = True return True viewer = TestViewer() ImageShow.register(viewer, -1) - im = hopper() - self.assertTrue(ImageShow.show(im)) - self.assertTrue(viewer.methodCalled) + for mode in ("1", "I;16", "LA", "RGB", "RGBA"): + im = hopper(mode) + self.assertTrue(ImageShow.show(im)) + self.assertTrue(viewer.methodCalled) # Restore original state ImageShow._viewers.pop(0) diff --git a/src/PIL/ImageMode.py b/src/PIL/ImageMode.py index fb16f28a467..596be7b9d7e 100644 --- a/src/PIL/ImageMode.py +++ b/src/PIL/ImageMode.py @@ -48,9 +48,17 @@ def getmode(mode): modes["La"] = ModeDescriptor("La", ("L", "a"), "L", "L") modes["PA"] = ModeDescriptor("PA", ("P", "A"), "RGB", "L") # mapping modes - modes["I;16"] = ModeDescriptor("I;16", "I", "L", "L") - modes["I;16L"] = ModeDescriptor("I;16L", "I", "L", "L") - modes["I;16B"] = ModeDescriptor("I;16B", "I", "L", "L") + for i16mode in ( + "I;16", + "I;16S", + "I;16L", + "I;16LS", + "I;16B", + "I;16BS", + "I;16N", + "I;16NS", + ): + modes[i16mode] = ModeDescriptor(i16mode, ("I",), "L", "L") # set global mode cache atomically _modes = modes return _modes[mode] diff --git a/src/PIL/ImageShow.py b/src/PIL/ImageShow.py index 8fc17a63816..209b803c59c 100644 --- a/src/PIL/ImageShow.py +++ b/src/PIL/ImageShow.py @@ -63,16 +63,12 @@ class Viewer(object): def show(self, image, **options): # save temporary image to disk - if image.mode[:4] == "I;16": - # @PIL88 @PIL101 - # "I;16" isn't an 'official' mode, but we still want to - # provide a simple way to show 16-bit images. - base = "L" - # FIXME: auto-contrast if max() > 255? - else: + if not ( + image.mode in ("1", "RGBA") or (self.format == "PNG" and image.mode == "LA") + ): base = Image.getmodebase(image.mode) - if base != image.mode and image.mode != "1" and image.mode != "RGBA": - image = image.convert(base) + if image.mode != base: + image = image.convert(base) return self.show_image(image, **options)