Pillow/Tests/test_image_draft.py

74 lines
2.9 KiB
Python
Raw Normal View History

from PIL import Image
from .helper import PillowTestCase, fromstring, tostring
2014-06-10 13:10:47 +04:00
class TestImageDraft(PillowTestCase):
def setUp(self):
2016-11-22 04:00:49 +03:00
codecs = dir(Image.core)
if "jpeg_encoder" not in codecs or "jpeg_decoder" not in codecs:
2014-06-10 13:10:47 +04:00
self.skipTest("jpeg support not available")
2016-11-22 04:00:49 +03:00
def draft_roundtrip(self, in_mode, in_size, req_mode, req_size):
im = Image.new(in_mode, in_size)
2019-06-13 18:54:24 +03:00
data = tostring(im, "JPEG")
2016-11-22 04:00:49 +03:00
im = fromstring(data)
mode, box = im.draft(req_mode, req_size)
scale, _ = im.decoderconfig
self.assertEqual(box[:2], (0, 0))
self.assertTrue((im.width - scale) < box[2] <= im.width)
2019-11-24 15:22:13 +03:00
self.assertTrue((im.height - scale) < box[3] <= im.height)
2016-11-22 04:00:49 +03:00
return im
2014-06-10 13:10:47 +04:00
def test_size(self):
2016-11-22 04:00:49 +03:00
for in_size, req_size, out_size in [
((435, 361), (2048, 2048), (435, 361)), # bigger
((435, 361), (435, 361), (435, 361)), # same
2016-11-22 04:28:04 +03:00
((128, 128), (64, 64), (64, 64)),
((128, 128), (32, 32), (32, 32)),
((128, 128), (16, 16), (16, 16)),
2016-11-22 04:00:49 +03:00
# large requested width
((435, 361), (218, 128), (435, 361)), # almost 2x
((435, 361), (217, 128), (218, 181)), # more than 2x
((435, 361), (109, 64), (218, 181)), # almost 4x
((435, 361), (108, 64), (109, 91)), # more than 4x
((435, 361), (55, 32), (109, 91)), # almost 8x
((435, 361), (54, 32), (55, 46)), # more than 8x
((435, 361), (27, 16), (55, 46)), # more than 16x
# and vice versa
((435, 361), (128, 181), (435, 361)), # almost 2x
((435, 361), (128, 180), (218, 181)), # more than 2x
((435, 361), (64, 91), (218, 181)), # almost 4x
((435, 361), (64, 90), (109, 91)), # more than 4x
((435, 361), (32, 46), (109, 91)), # almost 8x
((435, 361), (32, 45), (55, 46)), # more than 8x
((435, 361), (16, 22), (55, 46)), # more than 16x
]:
2019-06-13 18:54:24 +03:00
im = self.draft_roundtrip("L", in_size, None, req_size)
2016-11-22 04:28:04 +03:00
im.load()
2016-11-22 04:00:49 +03:00
self.assertEqual(im.size, out_size)
2014-06-10 13:10:47 +04:00
def test_mode(self):
2016-11-22 04:00:49 +03:00
for in_mode, req_mode, out_mode in [
("RGB", "1", "RGB"),
("RGB", "L", "L"),
("RGB", "RGB", "RGB"),
("RGB", "YCbCr", "YCbCr"),
("L", "1", "L"),
("L", "L", "L"),
("L", "RGB", "L"),
("L", "YCbCr", "L"),
("CMYK", "1", "CMYK"),
("CMYK", "L", "CMYK"),
("CMYK", "RGB", "CMYK"),
("CMYK", "YCbCr", "CMYK"),
]:
im = self.draft_roundtrip(in_mode, (64, 64), req_mode, None)
2016-11-22 04:28:04 +03:00
im.load()
2016-11-22 04:00:49 +03:00
self.assertEqual(im.mode, out_mode)
2014-06-10 13:10:47 +04:00
2016-11-22 04:28:04 +03:00
def test_several_drafts(self):
2019-06-13 18:54:24 +03:00
im = self.draft_roundtrip("L", (128, 128), None, (64, 64))
2016-11-22 04:28:04 +03:00
im.draft(None, (64, 64))
im.load()