Merge pull request #5856 from cmbruns/cmbruns/grayscale-16-bit-qimage

Support 16-bit grayscale ImageQt conversion
This commit is contained in:
mergify[bot] 2021-12-14 20:24:27 +00:00 committed by GitHub
commit f4c010b188
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 17 additions and 4 deletions

View File

@ -2,7 +2,7 @@ import pytest
from PIL import ImageQt from PIL import ImageQt
from .helper import hopper from .helper import assert_image_similar, hopper
pytestmark = pytest.mark.skipif( pytestmark = pytest.mark.skipif(
not ImageQt.qt_is_installed, reason="Qt bindings are not installed" not ImageQt.qt_is_installed, reason="Qt bindings are not installed"
@ -42,8 +42,17 @@ def test_rgb():
def test_image(): def test_image():
for mode in ("1", "RGB", "RGBA", "L", "P"): modes = ["1", "RGB", "RGBA", "L", "P"]
ImageQt.ImageQt(hopper(mode)) qt_format = ImageQt.QImage.Format if ImageQt.qt_version == "6" else ImageQt.QImage
if hasattr(qt_format, "Format_Grayscale16"): # Qt 5.13+
modes.append("I;16")
for mode in modes:
im = hopper(mode)
roundtripped_im = ImageQt.fromqimage(ImageQt.ImageQt(im))
if mode not in ("RGB", "RGBA"):
im = im.convert("RGB")
assert_image_similar(roundtripped_im, im, 1)
def test_closed_file(): def test_closed_file():

View File

@ -108,7 +108,7 @@ def align8to32(bytes, width, mode):
converts each scanline of data from 8 bit to 32 bit aligned converts each scanline of data from 8 bit to 32 bit aligned
""" """
bits_per_pixel = {"1": 1, "L": 8, "P": 8}[mode] bits_per_pixel = {"1": 1, "L": 8, "P": 8, "I;16": 16}[mode]
# calculate bytes per line and the extra padding if needed # calculate bytes per line and the extra padding if needed
bits_per_line = bits_per_pixel * width bits_per_line = bits_per_pixel * width
@ -167,6 +167,10 @@ def _toqclass_helper(im):
elif im.mode == "RGBA": elif im.mode == "RGBA":
data = im.tobytes("raw", "BGRA") data = im.tobytes("raw", "BGRA")
format = qt_format.Format_ARGB32 format = qt_format.Format_ARGB32
elif im.mode == "I;16" and hasattr(qt_format, "Format_Grayscale16"): # Qt 5.13+
im = im.point(lambda i: i * 256)
format = qt_format.Format_Grayscale16
else: else:
if exclusive_fp: if exclusive_fp:
im.close() im.close()