mirror of
https://github.com/python-pillow/Pillow.git
synced 2025-06-27 08:23:23 +03:00
Merge pull request #3869 from radarhere/imageshow
Do not down-convert if image is LA when showing with PNG format
This commit is contained in:
commit
f338eae128
|
@ -26,6 +26,17 @@ class TestImageMode(PillowTestCase):
|
||||||
self.assertEqual(m.basemode, "L")
|
self.assertEqual(m.basemode, "L")
|
||||||
self.assertEqual(m.basetype, "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")
|
m = ImageMode.getmode("RGB")
|
||||||
self.assertEqual(m.mode, "RGB")
|
self.assertEqual(m.mode, "RGB")
|
||||||
self.assertEqual(str(m), "RGB")
|
self.assertEqual(str(m), "RGB")
|
||||||
|
|
|
@ -18,18 +18,19 @@ class TestImageShow(PillowTestCase):
|
||||||
ImageShow._viewers.pop()
|
ImageShow._viewers.pop()
|
||||||
|
|
||||||
def test_show(self):
|
def test_show(self):
|
||||||
class TestViewer:
|
class TestViewer(ImageShow.Viewer):
|
||||||
methodCalled = False
|
methodCalled = False
|
||||||
|
|
||||||
def show(self, image, title=None, **options):
|
def show_image(self, image, **options):
|
||||||
self.methodCalled = True
|
self.methodCalled = True
|
||||||
return True
|
return True
|
||||||
viewer = TestViewer()
|
viewer = TestViewer()
|
||||||
ImageShow.register(viewer, -1)
|
ImageShow.register(viewer, -1)
|
||||||
|
|
||||||
im = hopper()
|
for mode in ("1", "I;16", "LA", "RGB", "RGBA"):
|
||||||
self.assertTrue(ImageShow.show(im))
|
im = hopper(mode)
|
||||||
self.assertTrue(viewer.methodCalled)
|
self.assertTrue(ImageShow.show(im))
|
||||||
|
self.assertTrue(viewer.methodCalled)
|
||||||
|
|
||||||
# Restore original state
|
# Restore original state
|
||||||
ImageShow._viewers.pop(0)
|
ImageShow._viewers.pop(0)
|
||||||
|
|
|
@ -48,9 +48,17 @@ def getmode(mode):
|
||||||
modes["La"] = ModeDescriptor("La", ("L", "a"), "L", "L")
|
modes["La"] = ModeDescriptor("La", ("L", "a"), "L", "L")
|
||||||
modes["PA"] = ModeDescriptor("PA", ("P", "A"), "RGB", "L")
|
modes["PA"] = ModeDescriptor("PA", ("P", "A"), "RGB", "L")
|
||||||
# mapping modes
|
# mapping modes
|
||||||
modes["I;16"] = ModeDescriptor("I;16", "I", "L", "L")
|
for i16mode in (
|
||||||
modes["I;16L"] = ModeDescriptor("I;16L", "I", "L", "L")
|
"I;16",
|
||||||
modes["I;16B"] = ModeDescriptor("I;16B", "I", "L", "L")
|
"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
|
# set global mode cache atomically
|
||||||
_modes = modes
|
_modes = modes
|
||||||
return _modes[mode]
|
return _modes[mode]
|
||||||
|
|
|
@ -63,16 +63,12 @@ class Viewer(object):
|
||||||
def show(self, image, **options):
|
def show(self, image, **options):
|
||||||
|
|
||||||
# save temporary image to disk
|
# save temporary image to disk
|
||||||
if image.mode[:4] == "I;16":
|
if not (
|
||||||
# @PIL88 @PIL101
|
image.mode in ("1", "RGBA") or (self.format == "PNG" and image.mode == "LA")
|
||||||
# "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:
|
|
||||||
base = Image.getmodebase(image.mode)
|
base = Image.getmodebase(image.mode)
|
||||||
if base != image.mode and image.mode != "1" and image.mode != "RGBA":
|
if image.mode != base:
|
||||||
image = image.convert(base)
|
image = image.convert(base)
|
||||||
|
|
||||||
return self.show_image(image, **options)
|
return self.show_image(image, **options)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user