Merge pull request #3026 from radarhere/health

Health fixes
This commit is contained in:
Hugo 2018-03-10 08:56:53 +02:00 committed by GitHub
commit b9f688301a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
83 changed files with 293 additions and 214 deletions

View File

@ -14,6 +14,7 @@ def bench(mode):
get(xy) get(xy)
print(mode, timeit.default_timer() - t0, "us") print(mode, timeit.default_timer() - t0, "us")
bench("L") bench("L")
bench("I") bench("I")
bench("I;16") bench("I;16")

View File

@ -40,5 +40,6 @@ class TestImagingLeaks(PillowTestCase):
# Pass a new list at each iteration. # Pass a new list at each iteration.
lambda: im.point(range(256))) lambda: im.point(range(256)))
if __name__ == '__main__': if __name__ == '__main__':
unittest.main() unittest.main()

View File

@ -10,5 +10,6 @@ class TestJ2kEncodeOverflow(PillowTestCase):
with self.assertRaises(IOError): with self.assertRaises(IOError):
im.save(target) im.save(target)
if __name__ == '__main__': if __name__ == '__main__':
unittest.main() unittest.main()

View File

@ -60,5 +60,6 @@ class TestPngDos(PillowTestCase):
self.assertLess(total_len, 64*1024*1024, self.assertLess(total_len, 64*1024*1024,
"Total text chunks greater than 64M") "Total text chunks greater than 64M")
if __name__ == '__main__': if __name__ == '__main__':
unittest.main() unittest.main()

View File

@ -17,7 +17,8 @@ HAS_UPLOADER = False
if os.environ.get('SHOW_ERRORS', None): if os.environ.get('SHOW_ERRORS', None):
# local img.show for errors. # local img.show for errors.
HAS_UPLOADER=True HAS_UPLOADER = True
class test_image_results: class test_image_results:
@classmethod @classmethod
def upload(self, a, b): def upload(self, a, b):
@ -31,7 +32,6 @@ else:
pass pass
def convert_to_comparable(a, b): def convert_to_comparable(a, b):
new_a, new_b = a, b new_a, new_b = a, b
if a.mode == 'P': if a.mode == 'P':

View File

@ -32,6 +32,7 @@ def check(size, i0):
h[i] = m h[i] = m
return h return h
min_start = 0 min_start = 0
# 1) find the smallest table size with no collisions # 1) find the smallest table size with no collisions

View File

@ -23,5 +23,6 @@ class TestBinary(PillowTestCase):
self.assertEqual(_binary.o16be(65535), b'\xff\xff') self.assertEqual(_binary.o16be(65535), b'\xff\xff')
self.assertEqual(_binary.o32be(65535), b'\x00\x00\xff\xff') self.assertEqual(_binary.o32be(65535), b'\x00\x00\xff\xff')
if __name__ == '__main__': if __name__ == '__main__':
unittest.main() unittest.main()

View File

@ -30,7 +30,7 @@ class TestDecompressionBomb(PillowTestCase):
def test_warning(self): def test_warning(self):
# Set limit to trigger warning on the test file # Set limit to trigger warning on the test file
Image.MAX_IMAGE_PIXELS = 128 * 128 -1 Image.MAX_IMAGE_PIXELS = 128 * 128 - 1
self.assertEqual(Image.MAX_IMAGE_PIXELS, 128 * 128 - 1) self.assertEqual(Image.MAX_IMAGE_PIXELS, 128 * 128 - 1)
self.assert_warning(Image.DecompressionBombWarning, self.assert_warning(Image.DecompressionBombWarning,
@ -38,12 +38,13 @@ class TestDecompressionBomb(PillowTestCase):
def test_exception(self): def test_exception(self):
# Set limit to trigger exception on the test file # Set limit to trigger exception on the test file
Image.MAX_IMAGE_PIXELS = 64 * 128 -1 Image.MAX_IMAGE_PIXELS = 64 * 128 - 1
self.assertEqual(Image.MAX_IMAGE_PIXELS, 64 * 128 - 1) self.assertEqual(Image.MAX_IMAGE_PIXELS, 64 * 128 - 1)
self.assertRaises(Image.DecompressionBombError, self.assertRaises(Image.DecompressionBombError,
lambda: Image.open(TEST_FILE)) lambda: Image.open(TEST_FILE))
class TestDecompressionCrop(PillowTestCase): class TestDecompressionCrop(PillowTestCase):
def setUp(self): def setUp(self):

View File

@ -111,5 +111,6 @@ class TestFileDds(PillowTestCase):
self.assertRaises(IOError, short_file) self.assertRaises(IOError, short_file)
if __name__ == '__main__': if __name__ == '__main__':
unittest.main() unittest.main()

View File

@ -15,5 +15,6 @@ class TestFileFtex(PillowTestCase):
target = Image.open('Tests/images/ftex_dxt1.png') target = Image.open('Tests/images/ftex_dxt1.png')
self.assert_image_similar(im, target.convert('RGBA'), 15) self.assert_image_similar(im, target.convert('RGBA'), 15)
if __name__ == '__main__': if __name__ == '__main__':
unittest.main() unittest.main()

View File

@ -18,5 +18,6 @@ class TestFileGbr(PillowTestCase):
self.assert_image_equal(target, im) self.assert_image_equal(target, im)
if __name__ == '__main__': if __name__ == '__main__':
unittest.main() unittest.main()

View File

@ -266,7 +266,7 @@ class TestFileGif(PillowTestCase):
Image.new('L', (100, 100), '#111'), Image.new('L', (100, 100), '#111'),
Image.new('L', (100, 100), '#222'), Image.new('L', (100, 100), '#222'),
] ]
for method in range(0,4): for method in range(0, 4):
im_list[0].save( im_list[0].save(
out, out,
save_all=True, save_all=True,
@ -278,7 +278,6 @@ class TestFileGif(PillowTestCase):
img.seek(img.tell() + 1) img.seek(img.tell() + 1)
self.assertEqual(img.disposal_method, method) self.assertEqual(img.disposal_method, method)
# check per frame disposal # check per frame disposal
im_list[0].save( im_list[0].save(
out, out,
@ -586,5 +585,6 @@ class TestFileGif(PillowTestCase):
# codec error prepatch # codec error prepatch
im.load() im.load()
if __name__ == '__main__': if __name__ == '__main__':
unittest.main() unittest.main()

View File

@ -141,7 +141,7 @@ class TestFileJpeg(PillowTestCase):
f = self.tempfile("temp.jpg") f = self.tempfile("temp.jpg")
icc_profile = im.info["icc_profile"] icc_profile = im.info["icc_profile"]
try: try:
im.save(f, format='JPEG', progressive=True,quality=95, im.save(f, format='JPEG', progressive=True, quality=95,
icc_profile=icc_profile, optimize=True) icc_profile=icc_profile, optimize=True)
except IOError: except IOError:
self.fail("Failed saving image with icc larger than image size") self.fail("Failed saving image with icc larger than image size")

View File

@ -176,5 +176,6 @@ class TestFileJpeg2k(PillowTestCase):
with self.assertRaises(IOError): with self.assertRaises(IOError):
Image.open('Tests/images/unbound_variable.jp2') Image.open('Tests/images/unbound_variable.jp2')
if __name__ == '__main__': if __name__ == '__main__':
unittest.main() unittest.main()

View File

@ -22,6 +22,7 @@ def chunk(cid, *data):
PngImagePlugin.putchunk(*(test_file, cid) + data) PngImagePlugin.putchunk(*(test_file, cid) + data)
return test_file.getvalue() return test_file.getvalue()
o32 = PngImagePlugin.o32 o32 = PngImagePlugin.o32
IHDR = chunk(b"IHDR", o32(1), o32(1), b'\x08\x02', b'\0\0\0') IHDR = chunk(b"IHDR", o32(1), o32(1), b'\x08\x02', b'\0\0\0')

View File

@ -46,5 +46,6 @@ class TestFileSun(PillowTestCase):
with Image.open(target_path) as target: with Image.open(target_path) as target:
self.assert_image_equal(im, target) self.assert_image_equal(im, target)
if __name__ == '__main__': if __name__ == '__main__':
unittest.main() unittest.main()

View File

@ -178,8 +178,8 @@ class TestFileTiff(PillowTestCase):
im = Image.open('Tests/images/16bit.s.tif') im = Image.open('Tests/images/16bit.s.tif')
im.load() im.load()
self.assertEqual(im.mode, 'I') self.assertEqual(im.mode, 'I')
self.assertEqual(im.getpixel((0,0)),32767) self.assertEqual(im.getpixel((0, 0)), 32767)
self.assertEqual(im.getpixel((0,1)),0) self.assertEqual(im.getpixel((0, 1)), 0)
def test_12bit_rawmode(self): def test_12bit_rawmode(self):
""" Are we generating the same interpretation """ Are we generating the same interpretation
@ -398,7 +398,6 @@ class TestFileTiff(PillowTestCase):
self.assertEqual(im.tag_v2[X_RESOLUTION], 72) self.assertEqual(im.tag_v2[X_RESOLUTION], 72)
self.assertEqual(im.tag_v2[Y_RESOLUTION], 36) self.assertEqual(im.tag_v2[Y_RESOLUTION], 36)
def test_roundtrip_tiff_uint16(self): def test_roundtrip_tiff_uint16(self):
# Test an image of all '0' values # Test an image of all '0' values
pixel_value = 0x1234 pixel_value = 0x1234
@ -447,7 +446,6 @@ class TestFileTiff(PillowTestCase):
reread = Image.open(mp) reread = Image.open(mp)
self.assertEqual(reread.n_frames, 3) self.assertEqual(reread.n_frames, 3)
def test_saving_icc_profile(self): def test_saving_icc_profile(self):
# Tests saving TIFF with icc_profile set. # Tests saving TIFF with icc_profile set.
# At the time of writing this will only work for non-compressed tiffs # At the time of writing this will only work for non-compressed tiffs
@ -489,6 +487,7 @@ class TestFileTiff(PillowTestCase):
im.load() im.load()
self.assertFalse(fp.closed) self.assertFalse(fp.closed)
@unittest.skipUnless(sys.platform.startswith('win32'), "Windows only") @unittest.skipUnless(sys.platform.startswith('win32'), "Windows only")
class TestFileTiffW32(PillowTestCase): class TestFileTiffW32(PillowTestCase):
def test_fd_leak(self): def test_fd_leak(self):

View File

@ -78,7 +78,6 @@ class TestFileTiffMetadata(PillowTestCase):
self.assertEqual(loaded.tag[ImageJMetaDataByteCounts], (8, len(bindata) - 8)) self.assertEqual(loaded.tag[ImageJMetaDataByteCounts], (8, len(bindata) - 8))
self.assertEqual(loaded.tag_v2[ImageJMetaDataByteCounts], (8, len(bindata) - 8)) self.assertEqual(loaded.tag_v2[ImageJMetaDataByteCounts], (8, len(bindata) - 8))
def test_read_metadata(self): def test_read_metadata(self):
img = Image.open('Tests/images/hopper_g4.tif') img = Image.open('Tests/images/hopper_g4.tif')
@ -243,7 +242,7 @@ class TestFileTiffMetadata(PillowTestCase):
ifd = TiffImagePlugin.ImageFileDirectory_v2() ifd = TiffImagePlugin.ImageFileDirectory_v2()
# 277: ("SamplesPerPixel", SHORT, 1), # 277: ("SamplesPerPixel", SHORT, 1),
ifd._tagdata[277] = struct.pack('hh', 4,4) ifd._tagdata[277] = struct.pack('hh', 4, 4)
ifd.tagtype[277] = TiffTags.SHORT ifd.tagtype[277] = TiffTags.SHORT
try: try:

View File

@ -3,16 +3,17 @@ from helper import unittest, PillowLeakTestCase
import sys import sys
from PIL import Image, features, ImageDraw, ImageFont from PIL import Image, features, ImageDraw, ImageFont
@unittest.skipIf(sys.platform.startswith('win32'), "requires Unix or MacOS") @unittest.skipIf(sys.platform.startswith('win32'), "requires Unix or MacOS")
class TestTTypeFontLeak(PillowLeakTestCase): class TestTTypeFontLeak(PillowLeakTestCase):
# fails at iteration 3 in master # fails at iteration 3 in master
iterations = 10 iterations = 10
mem_limit = 4096 #k mem_limit = 4096 # k
def _test_font(self, font): def _test_font(self, font):
im = Image.new('RGB', (255,255), 'white') im = Image.new('RGB', (255, 255), 'white')
draw = ImageDraw.ImageDraw(im) draw = ImageDraw.ImageDraw(im)
self._test_leak(lambda: draw.text((0, 0), "some text "*1024, #~10k self._test_leak(lambda: draw.text((0, 0), "some text "*1024, # ~10k
font=font, fill="black")) font=font, fill="black"))
@unittest.skipIf(not features.check('freetype2'), "Test requires freetype2") @unittest.skipIf(not features.check('freetype2'), "Test requires freetype2")
@ -20,10 +21,11 @@ class TestTTypeFontLeak(PillowLeakTestCase):
ttype = ImageFont.truetype('Tests/fonts/FreeMono.ttf', 20) ttype = ImageFont.truetype('Tests/fonts/FreeMono.ttf', 20)
self._test_font(ttype) self._test_font(ttype)
class TestDefaultFontLeak(TestTTypeFontLeak): class TestDefaultFontLeak(TestTTypeFontLeak):
# fails at iteration 37 in master # fails at iteration 37 in master
iterations = 100 iterations = 100
mem_limit = 1024 #k mem_limit = 1024 # k
def test_leak(self): def test_leak(self):
default_font = ImageFont.load_default() default_font = ImageFont.load_default()

View File

@ -46,7 +46,7 @@ class TestFontPcf(PillowTestCase):
def test_draw(self): def test_draw(self):
tempname = self.save_font() tempname = self.save_font()
font = ImageFont.load(tempname) font = ImageFont.load(tempname)
im = Image.new("L", (130,30), "white") im = Image.new("L", (130, 30), "white")
draw = ImageDraw.Draw(im) draw = ImageDraw.Draw(im)
draw.text((0, 0), message, 'black', font=font) draw.text((0, 0), message, 'black', font=font)
with Image.open('Tests/images/test_draw_pbm_target.png') as target: with Image.open('Tests/images/test_draw_pbm_target.png') as target:
@ -56,23 +56,22 @@ class TestFontPcf(PillowTestCase):
tempname = self.save_font() tempname = self.save_font()
font = ImageFont.load(tempname) font = ImageFont.load(tempname)
for i in range(255): for i in range(255):
(dx,dy) = font.getsize(chr(i)) (dx, dy) = font.getsize(chr(i))
self.assertEqual(dy, 20) self.assertEqual(dy, 20)
self.assertIn(dx, (0,10)) self.assertIn(dx, (0, 10))
for l in range(len(message)): for l in range(len(message)):
msg = message[:l+1] msg = message[:l+1]
self.assertEqual(font.getsize(msg), (len(msg)*10,20)) self.assertEqual(font.getsize(msg), (len(msg)*10, 20))
def _test_high_characters(self, message): def _test_high_characters(self, message):
tempname = self.save_font() tempname = self.save_font()
font = ImageFont.load(tempname) font = ImageFont.load(tempname)
im = Image.new("L", (750,30) , "white") im = Image.new("L", (750, 30) , "white")
draw = ImageDraw.Draw(im) draw = ImageDraw.Draw(im)
draw.text((0, 0), message, "black", font=font) draw.text((0, 0), message, "black", font=font)
with Image.open('Tests/images/high_ascii_chars.png') as target: with Image.open('Tests/images/high_ascii_chars.png') as target:
self.assert_image_similar(im, target, 0) self.assert_image_similar(im, target, 0)
def test_high_characters(self): def test_high_characters(self):
message = "".join(chr(i+1) for i in range(140, 232)) message = "".join(chr(i+1) for i in range(140, 232))
self._test_high_characters(message) self._test_high_characters(message)

View File

@ -10,6 +10,7 @@ from PIL import Image
import sys import sys
import os import os
class AccessTest(PillowTestCase): class AccessTest(PillowTestCase):
# initial value # initial value
_init_cffi_access = Image.USE_CFFI_ACCESS _init_cffi_access = Image.USE_CFFI_ACCESS
@ -309,5 +310,6 @@ int main(int argc, char* argv[])
process.communicate() process.communicate()
self.assertEqual(process.returncode, 0) self.assertEqual(process.returncode, 0)
if __name__ == '__main__': if __name__ == '__main__':
unittest.main() unittest.main()

View File

@ -90,7 +90,6 @@ class TestImageConvert(PillowTestCase):
# https://github.com/python-pillow/Pillow/issues/2702 # https://github.com/python-pillow/Pillow/issues/2702
self.assertEqual(rgba.palette, None) self.assertEqual(rgba.palette, None)
def test_trns_l(self): def test_trns_l(self):
im = hopper('L') im = hopper('L')
im.info['transparency'] = 128 im.info['transparency'] = 128

View File

@ -70,5 +70,6 @@ class TestImageDraft(PillowTestCase):
im.draft(None, (64, 64)) im.draft(None, (64, 64))
im.load() im.load()
if __name__ == '__main__': if __name__ == '__main__':
unittest.main() unittest.main()

View File

@ -29,5 +29,6 @@ class TestImageLoad(PillowTestCase):
self.assertRaises(OSError, os.fstat, fn) self.assertRaises(OSError, os.fstat, fn)
if __name__ == '__main__': if __name__ == '__main__':
unittest.main() unittest.main()

View File

@ -84,5 +84,6 @@ class TestImagePutData(PillowTestCase):
self.assertEqual(len(im.getdata()), len(arr)) self.assertEqual(len(im.getdata()), len(arr))
if __name__ == '__main__': if __name__ == '__main__':
unittest.main() unittest.main()

View File

@ -7,5 +7,6 @@ class TestImageToBytes(PillowTestCase):
data = hopper().tobytes() data = hopper().tobytes()
self.assertIsInstance(data, bytes) self.assertIsInstance(data, bytes)
if __name__ == '__main__': if __name__ == '__main__':
unittest.main() unittest.main()

View File

@ -61,7 +61,7 @@ class TestImageTransform(PillowTestCase):
Image.BILINEAR, Image.BILINEAR,
fillcolor = 'red') fillcolor = 'red')
self.assertEqual(transformed.getpixel((w-1,h-1)), (255,0,0)) self.assertEqual(transformed.getpixel((w-1, h-1)), (255, 0, 0))
def test_mesh(self): def test_mesh(self):
# this should be a checkerboard of halfsized hoppers in ul, lr # this should be a checkerboard of halfsized hoppers in ul, lr
@ -267,5 +267,6 @@ class TestImageTransformPerspective(TestImageTransformAffine):
# Repeat all tests for AFFINE transformations with PERSPECTIVE # Repeat all tests for AFFINE transformations with PERSPECTIVE
transform = Image.PERSPECTIVE transform = Image.PERSPECTIVE
if __name__ == '__main__': if __name__ == '__main__':
unittest.main() unittest.main()

View File

@ -437,5 +437,6 @@ class TestImageCms(PillowTestCase):
self.assert_image_equal(test_image.convert(dst_format[2]), reference_image) self.assert_image_equal(test_image.convert(dst_format[2]), reference_image)
if __name__ == '__main__': if __name__ == '__main__':
unittest.main() unittest.main()

View File

@ -146,6 +146,7 @@ class MockPyDecoder(ImageFile.PyDecoder):
# eof # eof
return (-1, 0) return (-1, 0)
xoff, yoff, xsize, ysize = 10, 20, 100, 100 xoff, yoff, xsize, ysize = 10, 20, 100, 100
@ -222,5 +223,6 @@ class TestPyDecoder(PillowTestCase):
im.tile = [("MOCK", (xoff, yoff, xoff+xsize, yoff+ysize + 100), 32, None)] im.tile = [("MOCK", (xoff, yoff, xoff+xsize, yoff+ysize + 100), 32, None)]
self.assertRaises(ValueError, im.load) self.assertRaises(ValueError, im.load)
if __name__ == '__main__': if __name__ == '__main__':
unittest.main() unittest.main()

View File

@ -420,7 +420,6 @@ class TestImageFont(PillowTestCase):
with self.assertRaises(UnicodeEncodeError): with self.assertRaises(UnicodeEncodeError):
font.getsize(u"") font.getsize(u"")
def _test_fake_loading_font(self, path_to_fake, fontname): def _test_fake_loading_font(self, path_to_fake, fontname):
# Make a copy of FreeTypeFont so we can patch the original # Make a copy of FreeTypeFont so we can patch the original
free_type_font = copy.deepcopy(ImageFont.FreeTypeFont) free_type_font = copy.deepcopy(ImageFont.FreeTypeFont)

View File

@ -34,5 +34,6 @@ class TestImageFontBitmap(PillowTestCase):
text, fill=(0, 0, 0), font=font_outline) text, fill=(0, 0, 0), font=font_outline)
self.assert_image_similar(im_bitmap, im_outline, 20) self.assert_image_similar(im_bitmap, im_outline, 20)
if __name__ == '__main__': if __name__ == '__main__':
unittest.main() unittest.main()

View File

@ -6,6 +6,7 @@ from PIL import Image, ImageDraw, ImageFont, features
FONT_SIZE = 20 FONT_SIZE = 20
FONT_PATH = "Tests/fonts/DejaVuSans.ttf" FONT_PATH = "Tests/fonts/DejaVuSans.ttf"
@unittest.skipUnless(features.check('raqm'), "Raqm Library is not installed.") @unittest.skipUnless(features.check('raqm'), "Raqm Library is not installed.")
class TestImagecomplextext(PillowTestCase): class TestImagecomplextext(PillowTestCase):
@ -16,7 +17,6 @@ class TestImagecomplextext(PillowTestCase):
draw = ImageDraw.Draw(im) draw = ImageDraw.Draw(im)
draw.text((0, 0), 'TEST', font=ttf, fill=500, direction='ltr') draw.text((0, 0), 'TEST', font=ttf, fill=500, direction='ltr')
def test_complex_text(self): def test_complex_text(self):
ttf = ImageFont.truetype(FONT_PATH, FONT_SIZE) ttf = ImageFont.truetype(FONT_PATH, FONT_SIZE)
@ -101,7 +101,7 @@ class TestImagecomplextext(PillowTestCase):
self.assert_image_similar(im, target_img, .5) self.assert_image_similar(im, target_img, .5)
liga_size = ttf.getsize('fi', features=['-liga']) liga_size = ttf.getsize('fi', features=['-liga'])
self.assertEqual(liga_size,(13,19)) self.assertEqual(liga_size, (13, 19))
def test_kerning_features(self): def test_kerning_features(self):
ttf = ImageFont.truetype(FONT_PATH, FONT_SIZE) ttf = ImageFont.truetype(FONT_PATH, FONT_SIZE)
@ -120,13 +120,14 @@ class TestImagecomplextext(PillowTestCase):
im = Image.new(mode='RGB', size=(300, 100)) im = Image.new(mode='RGB', size=(300, 100))
draw = ImageDraw.Draw(im) draw = ImageDraw.Draw(im)
draw.text((0, 0), 'اللغة العربية', font=ttf, fill=500, features=['-fina','-init','-medi']) draw.text((0, 0), 'اللغة العربية', font=ttf, fill=500, features=['-fina', '-init', '-medi'])
target = 'Tests/images/test_arabictext_features.png' target = 'Tests/images/test_arabictext_features.png'
target_img = Image.open(target) target_img = Image.open(target)
self.assert_image_similar(im, target_img, .5) self.assert_image_similar(im, target_img, .5)
if __name__ == '__main__': if __name__ == '__main__':
unittest.main() unittest.main()

View File

@ -13,6 +13,7 @@ def pixel(im):
return int(im) # hack to deal with booleans return int(im) # hack to deal with booleans
print(im) print(im)
A = Image.new("L", (1, 1), 1) A = Image.new("L", (1, 1), 1)
B = Image.new("L", (1, 1), 2) B = Image.new("L", (1, 1), 2)
Z = Image.new("L", (1, 1), 0) # Z for zero Z = Image.new("L", (1, 1), 0) # Z for zero

View File

@ -97,5 +97,6 @@ class TestImageOpsUsm(PillowTestCase):
self.assertTrue(236 <= gp(8, 6)[2] <= 239) self.assertTrue(236 <= gp(8, 6)[2] <= 239)
self.assertTrue(236 <= gp(8, 7)[1] <= 239) self.assertTrue(236 <= gp(8, 7)[1] <= 239)
if __name__ == '__main__': if __name__ == '__main__':
unittest.main() unittest.main()

View File

@ -70,5 +70,6 @@ class TestImageSequence(PillowTestCase):
color2 = im.getpalette()[0:3] color2 = im.getpalette()[0:3]
self.assertEqual(color1, color2) self.assertEqual(color1, color2)
if __name__ == '__main__': if __name__ == '__main__':
unittest.main() unittest.main()

View File

@ -24,26 +24,26 @@ class TestLibPack(PillowTestCase):
self.assertEqual(data, im.tobytes("raw", rawmode)) self.assertEqual(data, im.tobytes("raw", rawmode))
def test_1(self): def test_1(self):
self.assert_pack("1", "1", b'\x01', 0,0,0,0,0,0,0,X) self.assert_pack("1", "1", b'\x01', 0, 0, 0, 0, 0, 0, 0, X)
self.assert_pack("1", "1;I", b'\x01', X,X,X,X,X,X,X,0) self.assert_pack("1", "1;I", b'\x01', X, X, X, X, X, X, X, 0)
self.assert_pack("1", "1;R", b'\x01', X,0,0,0,0,0,0,0) self.assert_pack("1", "1;R", b'\x01', X, 0, 0, 0, 0, 0, 0, 0)
self.assert_pack("1", "1;IR", b'\x01', 0,X,X,X,X,X,X,X) self.assert_pack("1", "1;IR", b'\x01', 0, X, X, X, X, X, X, X)
self.assert_pack("1", "1", b'\xaa', X,0,X,0,X,0,X,0) self.assert_pack("1", "1", b'\xaa', X, 0, X, 0, X, 0, X, 0)
self.assert_pack("1", "1;I", b'\xaa', 0,X,0,X,0,X,0,X) self.assert_pack("1", "1;I", b'\xaa', 0, X, 0, X, 0, X, 0, X)
self.assert_pack("1", "1;R", b'\xaa', 0,X,0,X,0,X,0,X) self.assert_pack("1", "1;R", b'\xaa', 0, X, 0, X, 0, X, 0, X)
self.assert_pack("1", "1;IR", b'\xaa', X,0,X,0,X,0,X,0) self.assert_pack("1", "1;IR", b'\xaa', X, 0, X, 0, X, 0, X, 0)
self.assert_pack("1", "L", b'\xff\x00\x00\xff\x00\x00', X,0,0,X,0,0) self.assert_pack("1", "L", b'\xff\x00\x00\xff\x00\x00', X, 0, 0, X, 0, 0)
def test_L(self): def test_L(self):
self.assert_pack("L", "L", 1, 1,2,3,4) self.assert_pack("L", "L", 1, 1, 2, 3, 4)
self.assert_pack("L", "L;16", b'\x00\xc6\x00\xaf', 198, 175) self.assert_pack("L", "L;16", b'\x00\xc6\x00\xaf', 198, 175)
self.assert_pack("L", "L;16B", b'\xc6\x00\xaf\x00', 198, 175) self.assert_pack("L", "L;16B", b'\xc6\x00\xaf\x00', 198, 175)
def test_LA(self): def test_LA(self):
self.assert_pack("LA", "LA", 2, (1,2), (3,4), (5,6)) self.assert_pack("LA", "LA", 2, (1, 2), (3, 4), (5, 6))
self.assert_pack("LA", "LA;L", 2, (1,4), (2,5), (3,6)) self.assert_pack("LA", "LA;L", 2, (1, 4), (2, 5), (3, 6))
def test_P(self): def test_P(self):
self.assert_pack("P", "P;1", b'\xe4', 1, 1, 1, 0, 0, 255, 0, 0) self.assert_pack("P", "P;1", b'\xe4', 1, 1, 1, 0, 0, 255, 0, 0)
@ -52,100 +52,100 @@ class TestLibPack(PillowTestCase):
self.assert_pack("P", "P", 1, 1, 2, 3, 4) self.assert_pack("P", "P", 1, 1, 2, 3, 4)
def test_PA(self): def test_PA(self):
self.assert_pack("PA", "PA", 2, (1,2), (3,4), (5,6)) self.assert_pack("PA", "PA", 2, (1, 2), (3, 4), (5, 6))
self.assert_pack("PA", "PA;L", 2, (1,4), (2,5), (3,6)) self.assert_pack("PA", "PA;L", 2, (1, 4), (2, 5), (3, 6))
def test_RGB(self): def test_RGB(self):
self.assert_pack("RGB", "RGB", 3, (1,2,3), (4,5,6), (7,8,9)) self.assert_pack("RGB", "RGB", 3, (1, 2, 3), (4, 5, 6), (7, 8, 9))
self.assert_pack("RGB", "RGBX", self.assert_pack("RGB", "RGBX",
b'\x01\x02\x03\xff\x05\x06\x07\xff', (1,2,3), (5,6,7)) b'\x01\x02\x03\xff\x05\x06\x07\xff', (1, 2, 3), (5, 6, 7))
self.assert_pack("RGB", "XRGB", self.assert_pack("RGB", "XRGB",
b'\x00\x02\x03\x04\x00\x06\x07\x08', (2,3,4), (6,7,8)) b'\x00\x02\x03\x04\x00\x06\x07\x08', (2, 3, 4), (6, 7, 8))
self.assert_pack("RGB", "BGR", 3, (3,2,1), (6,5,4), (9,8,7)) self.assert_pack("RGB", "BGR", 3, (3, 2, 1), (6, 5, 4), (9, 8, 7))
self.assert_pack("RGB", "BGRX", self.assert_pack("RGB", "BGRX",
b'\x01\x02\x03\x00\x05\x06\x07\x00', (3,2,1), (7,6,5)) b'\x01\x02\x03\x00\x05\x06\x07\x00', (3, 2, 1), (7, 6, 5))
self.assert_pack("RGB", "XBGR", self.assert_pack("RGB", "XBGR",
b'\x00\x02\x03\x04\x00\x06\x07\x08', (4,3,2), (8,7,6)) b'\x00\x02\x03\x04\x00\x06\x07\x08', (4, 3, 2), (8, 7, 6))
self.assert_pack("RGB", "RGB;L", 3, (1,4,7), (2,5,8), (3,6,9)) self.assert_pack("RGB", "RGB;L", 3, (1, 4, 7), (2, 5, 8), (3, 6, 9))
self.assert_pack("RGB", "R", 1, (1,9,9), (2,9,9), (3,9,9)) self.assert_pack("RGB", "R", 1, (1, 9, 9), (2, 9, 9), (3, 9, 9))
self.assert_pack("RGB", "G", 1, (9,1,9), (9,2,9), (9,3,9)) self.assert_pack("RGB", "G", 1, (9, 1, 9), (9, 2, 9), (9, 3, 9))
self.assert_pack("RGB", "B", 1, (9,9,1), (9,9,2), (9,9,3)) self.assert_pack("RGB", "B", 1, (9, 9, 1), (9, 9, 2), (9, 9, 3))
def test_RGBA(self): def test_RGBA(self):
self.assert_pack("RGBA", "RGBA", 4, self.assert_pack("RGBA", "RGBA", 4,
(1,2,3,4), (5,6,7,8), (9,10,11,12)) (1, 2, 3, 4), (5, 6, 7, 8), (9, 10, 11, 12))
self.assert_pack("RGBA", "RGBA;L", 4, self.assert_pack("RGBA", "RGBA;L", 4,
(1,4,7,10), (2,5,8,11), (3,6,9,12)) (1, 4, 7, 10), (2, 5, 8, 11), (3, 6, 9, 12))
self.assert_pack("RGBA", "RGB", 3, (1,2,3,14), (4,5,6,15), (7,8,9,16)) self.assert_pack("RGBA", "RGB", 3, (1, 2, 3, 14), (4, 5, 6, 15), (7, 8, 9, 16))
self.assert_pack("RGBA", "BGR", 3, (3,2,1,14), (6,5,4,15), (9,8,7,16)) self.assert_pack("RGBA", "BGR", 3, (3, 2, 1, 14), (6, 5, 4, 15), (9, 8, 7, 16))
self.assert_pack("RGBA", "BGRA", 4, self.assert_pack("RGBA", "BGRA", 4,
(3,2,1,4), (7,6,5,8), (11,10,9,12)) (3, 2, 1, 4), (7, 6, 5, 8), (11, 10, 9, 12))
self.assert_pack("RGBA", "ABGR", 4, self.assert_pack("RGBA", "ABGR", 4,
(4,3,2,1), (8,7,6,5), (12,11,10,9)) (4, 3, 2, 1), (8, 7, 6, 5), (12, 11, 10, 9))
self.assert_pack("RGBA", "BGRa", 4, self.assert_pack("RGBA", "BGRa", 4,
(191,127,63,4), (223,191,159,8), (233,212,191,12)) (191, 127, 63, 4), (223, 191, 159, 8), (233, 212, 191, 12))
self.assert_pack("RGBA", "R", 1, (1,0,8,9), (2,0,8,9), (3,0,8,0)) self.assert_pack("RGBA", "R", 1, (1, 0, 8, 9), (2, 0, 8, 9), (3, 0, 8, 0))
self.assert_pack("RGBA", "G", 1, (6,1,8,9), (6,2,8,9), (6,3,8,9)) self.assert_pack("RGBA", "G", 1, (6, 1, 8, 9), (6, 2, 8, 9), (6, 3, 8, 9))
self.assert_pack("RGBA", "B", 1, (6,7,1,9), (6,7,2,0), (6,7,3,9)) self.assert_pack("RGBA", "B", 1, (6, 7, 1, 9), (6, 7, 2, 0), (6, 7, 3, 9))
self.assert_pack("RGBA", "A", 1, (6,7,0,1), (6,7,0,2), (0,7,0,3)) self.assert_pack("RGBA", "A", 1, (6, 7, 0, 1), (6, 7, 0, 2), (0, 7, 0, 3))
def test_RGBa(self): def test_RGBa(self):
self.assert_pack("RGBa", "RGBa", 4, self.assert_pack("RGBa", "RGBa", 4,
(1,2,3,4), (5,6,7,8), (9,10,11,12)) (1, 2, 3, 4), (5, 6, 7, 8), (9, 10, 11, 12))
self.assert_pack("RGBa", "BGRa", 4, self.assert_pack("RGBa", "BGRa", 4,
(3,2,1,4), (7,6,5,8), (11,10,9,12)) (3, 2, 1, 4), (7, 6, 5, 8), (11, 10, 9, 12))
self.assert_pack("RGBa", "aBGR", 4, self.assert_pack("RGBa", "aBGR", 4,
(4,3,2,1), (8,7,6,5), (12,11,10,9)) (4, 3, 2, 1), (8, 7, 6, 5), (12, 11, 10, 9))
def test_RGBX(self): def test_RGBX(self):
self.assert_pack("RGBX", "RGBX", 4, (1,2,3,4), (5,6,7,8), (9,10,11,12)) self.assert_pack("RGBX", "RGBX", 4, (1, 2, 3, 4), (5, 6, 7, 8), (9, 10, 11, 12))
self.assert_pack("RGBX", "RGBX;L", 4, (1,4,7,10), (2,5,8,11), (3,6,9,12)) self.assert_pack("RGBX", "RGBX;L", 4, (1, 4, 7, 10), (2, 5, 8, 11), (3, 6, 9, 12))
self.assert_pack("RGBX", "RGB", 3, (1,2,3,X), (4,5,6,X), (7,8,9,X)) self.assert_pack("RGBX", "RGB", 3, (1, 2, 3, X), (4, 5, 6, X), (7, 8, 9, X))
self.assert_pack("RGBX", "BGR", 3, (3,2,1,X), (6,5,4,X), (9,8,7,X)) self.assert_pack("RGBX", "BGR", 3, (3, 2, 1, X), (6, 5, 4, X), (9, 8, 7, X))
self.assert_pack("RGBX", "BGRX", self.assert_pack("RGBX", "BGRX",
b'\x01\x02\x03\x00\x05\x06\x07\x00\t\n\x0b\x00', b'\x01\x02\x03\x00\x05\x06\x07\x00\t\n\x0b\x00',
(3,2,1,X), (7,6,5,X), (11,10,9,X)) (3, 2, 1, X), (7, 6, 5, X), (11, 10, 9, X))
self.assert_pack("RGBX", "XBGR", self.assert_pack("RGBX", "XBGR",
b'\x00\x02\x03\x04\x00\x06\x07\x08\x00\n\x0b\x0c', b'\x00\x02\x03\x04\x00\x06\x07\x08\x00\n\x0b\x0c',
(4,3,2,X), (8,7,6,X), (12,11,10,X)) (4, 3, 2, X), (8, 7, 6, X), (12, 11, 10, X))
self.assert_pack("RGBX", "R", 1, (1,0,8,9), (2,0,8,9), (3,0,8,0)) self.assert_pack("RGBX", "R", 1, (1, 0, 8, 9), (2, 0, 8, 9), (3, 0, 8, 0))
self.assert_pack("RGBX", "G", 1, (6,1,8,9), (6,2,8,9), (6,3,8,9)) self.assert_pack("RGBX", "G", 1, (6, 1, 8, 9), (6, 2, 8, 9), (6, 3, 8, 9))
self.assert_pack("RGBX", "B", 1, (6,7,1,9), (6,7,2,0), (6,7,3,9)) self.assert_pack("RGBX", "B", 1, (6, 7, 1, 9), (6, 7, 2, 0), (6, 7, 3, 9))
self.assert_pack("RGBX", "X", 1, (6,7,0,1), (6,7,0,2), (0,7,0,3)) self.assert_pack("RGBX", "X", 1, (6, 7, 0, 1), (6, 7, 0, 2), (0, 7, 0, 3))
def test_CMYK(self): def test_CMYK(self):
self.assert_pack("CMYK", "CMYK", 4, (1,2,3,4), (5,6,7,8), (9,10,11,12)) self.assert_pack("CMYK", "CMYK", 4, (1, 2, 3, 4), (5, 6, 7, 8), (9, 10, 11, 12))
self.assert_pack("CMYK", "CMYK;I", 4, self.assert_pack("CMYK", "CMYK;I", 4,
(254,253,252,251), (250,249,248,247), (246,245,244,243)) (254, 253, 252, 251), (250, 249, 248, 247), (246, 245, 244, 243))
self.assert_pack("CMYK", "CMYK;L", 4, self.assert_pack("CMYK", "CMYK;L", 4,
(1,4,7,10), (2,5,8,11), (3,6,9,12)) (1, 4, 7, 10), (2, 5, 8, 11), (3, 6, 9, 12))
self.assert_pack("CMYK", "K", 1, (6,7,0,1), (6,7,0,2), (0,7,0,3)) self.assert_pack("CMYK", "K", 1, (6, 7, 0, 1), (6, 7, 0, 2), (0, 7, 0, 3))
def test_YCbCr(self): def test_YCbCr(self):
self.assert_pack("YCbCr", "YCbCr", 3, (1,2,3), (4,5,6), (7,8,9)) self.assert_pack("YCbCr", "YCbCr", 3, (1, 2, 3), (4, 5, 6), (7, 8, 9))
self.assert_pack("YCbCr", "YCbCr;L", 3, (1,4,7), (2,5,8), (3,6,9)) self.assert_pack("YCbCr", "YCbCr;L", 3, (1, 4, 7), (2, 5, 8), (3, 6, 9))
self.assert_pack("YCbCr", "YCbCrX", self.assert_pack("YCbCr", "YCbCrX",
b'\x01\x02\x03\xff\x05\x06\x07\xff\t\n\x0b\xff', b'\x01\x02\x03\xff\x05\x06\x07\xff\t\n\x0b\xff',
(1,2,3), (5,6,7), (9,10,11)) (1, 2, 3), (5, 6, 7), (9, 10, 11))
self.assert_pack("YCbCr", "YCbCrK", self.assert_pack("YCbCr", "YCbCrK",
b'\x01\x02\x03\xff\x05\x06\x07\xff\t\n\x0b\xff', b'\x01\x02\x03\xff\x05\x06\x07\xff\t\n\x0b\xff',
(1,2,3), (5,6,7), (9,10,11)) (1, 2, 3), (5, 6, 7), (9, 10, 11))
self.assert_pack("YCbCr", "Y", 1, (1,0,8,9), (2,0,8,9), (3,0,8,0)) self.assert_pack("YCbCr", "Y", 1, (1, 0, 8, 9), (2, 0, 8, 9), (3, 0, 8, 0))
self.assert_pack("YCbCr", "Cb", 1, (6,1,8,9), (6,2,8,9), (6,3,8,9)) self.assert_pack("YCbCr", "Cb", 1, (6, 1, 8, 9), (6, 2, 8, 9), (6, 3, 8, 9))
self.assert_pack("YCbCr", "Cr", 1, (6,7,1,9), (6,7,2,0), (6,7,3,9)) self.assert_pack("YCbCr", "Cr", 1, (6, 7, 1, 9), (6, 7, 2, 0), (6, 7, 3, 9))
def test_LAB(self): def test_LAB(self):
self.assert_pack("LAB", "LAB", 3, self.assert_pack("LAB", "LAB", 3,
(1,130,131), (4,133,134), (7,136,137)) (1, 130, 131), (4, 133, 134), (7, 136, 137))
self.assert_pack("LAB", "L", 1, (1,9,9), (2,9,9), (3,9,9)) self.assert_pack("LAB", "L", 1, (1, 9, 9), (2, 9, 9), (3, 9, 9))
self.assert_pack("LAB", "A", 1, (9,1,9), (9,2,9), (9,3,9)) self.assert_pack("LAB", "A", 1, (9, 1, 9), (9, 2, 9), (9, 3, 9))
self.assert_pack("LAB", "B", 1, (9,9,1), (9,9,2), (9,9,3)) self.assert_pack("LAB", "B", 1, (9, 9, 1), (9, 9, 2), (9, 9, 3))
def test_HSV(self): def test_HSV(self):
self.assert_pack("HSV", "HSV", 3, (1,2,3), (4,5,6), (7,8,9)) self.assert_pack("HSV", "HSV", 3, (1, 2, 3), (4, 5, 6), (7, 8, 9))
self.assert_pack("HSV", "H", 1, (1,9,9), (2,9,9), (3,9,9)) self.assert_pack("HSV", "H", 1, (1, 9, 9), (2, 9, 9), (3, 9, 9))
self.assert_pack("HSV", "S", 1, (9,1,9), (9,2,9), (9,3,9)) self.assert_pack("HSV", "S", 1, (9, 1, 9), (9, 2, 9), (9, 3, 9))
self.assert_pack("HSV", "V", 1, (9,9,1), (9,9,2), (9,9,3)) self.assert_pack("HSV", "V", 1, (9, 9, 1), (9, 9, 2), (9, 9, 3))
def test_I(self): def test_I(self):
self.assert_pack("I", "I;16B", 2, 0x0102, 0x0304) self.assert_pack("I", "I;16B", 2, 0x0102, 0x0304)
@ -226,7 +226,6 @@ class TestLibUnpack(PillowTestCase):
self.assert_unpack("L", "L;16", b'\x00\xc6\x00\xaf', 198, 175) self.assert_unpack("L", "L;16", b'\x00\xc6\x00\xaf', 198, 175)
self.assert_unpack("L", "L;16B", b'\xc6\x00\xaf\x00', 198, 175) self.assert_unpack("L", "L;16B", b'\xc6\x00\xaf\x00', 198, 175)
def test_LA(self): def test_LA(self):
self.assert_unpack("LA", "LA", 2, (1, 2), (3, 4), (5, 6)) self.assert_unpack("LA", "LA", 2, (1, 2), (3, 4), (5, 6))
self.assert_unpack("LA", "LA;L", 2, (1, 4), (2, 5), (3, 6)) self.assert_unpack("LA", "LA;L", 2, (1, 4), (2, 5), (3, 6))
@ -245,163 +244,163 @@ class TestLibUnpack(PillowTestCase):
self.assert_unpack("PA", "PA;L", 2, (1, 4), (2, 5), (3, 6)) self.assert_unpack("PA", "PA;L", 2, (1, 4), (2, 5), (3, 6))
def test_RGB(self): def test_RGB(self):
self.assert_unpack("RGB", "RGB", 3, (1,2,3), (4,5,6), (7,8,9)) self.assert_unpack("RGB", "RGB", 3, (1, 2, 3), (4, 5, 6), (7, 8, 9))
self.assert_unpack("RGB", "RGB;L", 3, (1,4,7), (2,5,8), (3,6,9)) self.assert_unpack("RGB", "RGB;L", 3, (1, 4, 7), (2, 5, 8), (3, 6, 9))
self.assert_unpack("RGB", "RGB;R", 3, (128,64,192), (32,160,96)) self.assert_unpack("RGB", "RGB;R", 3, (128, 64, 192), (32, 160, 96))
self.assert_unpack("RGB", "RGB;16L", 6, (2,4,6), (8,10,12)) self.assert_unpack("RGB", "RGB;16L", 6, (2, 4, 6), (8, 10, 12))
self.assert_unpack("RGB", "RGB;16B", 6, (1,3,5), (7,9,11)) self.assert_unpack("RGB", "RGB;16B", 6, (1, 3, 5), (7, 9, 11))
self.assert_unpack("RGB", "BGR", 3, (3,2,1), (6,5,4), (9,8,7)) self.assert_unpack("RGB", "BGR", 3, (3, 2, 1), (6, 5, 4), (9, 8, 7))
self.assert_unpack("RGB", "RGB;15", 2, (8,131,0), (24,0,8)) self.assert_unpack("RGB", "RGB;15", 2, (8, 131, 0), (24, 0, 8))
self.assert_unpack("RGB", "BGR;15", 2, (0,131,8), (8,0,24)) self.assert_unpack("RGB", "BGR;15", 2, (0, 131, 8), (8, 0, 24))
self.assert_unpack("RGB", "RGB;16", 2, (8,64,0), (24,129,0)) self.assert_unpack("RGB", "RGB;16", 2, (8, 64, 0), (24, 129, 0))
self.assert_unpack("RGB", "BGR;16", 2, (0,64,8), (0,129,24)) self.assert_unpack("RGB", "BGR;16", 2, (0, 64, 8), (0, 129, 24))
self.assert_unpack("RGB", "RGB;4B", 2, (17,0,34), (51,0,68)) self.assert_unpack("RGB", "RGB;4B", 2, (17, 0, 34), (51, 0, 68))
self.assert_unpack("RGB", "RGBX", 4, (1,2,3), (5,6,7), (9,10,11)) self.assert_unpack("RGB", "RGBX", 4, (1, 2, 3), (5, 6, 7), (9, 10, 11))
self.assert_unpack("RGB", "RGBX;L", 4, (1,4,7), (2,5,8), (3,6,9)) self.assert_unpack("RGB", "RGBX;L", 4, (1, 4, 7), (2, 5, 8), (3, 6, 9))
self.assert_unpack("RGB", "BGRX", 4, (3,2,1), (7,6,5), (11,10,9)) self.assert_unpack("RGB", "BGRX", 4, (3, 2, 1), (7, 6, 5), (11, 10, 9))
self.assert_unpack("RGB", "XRGB", 4, (2,3,4), (6,7,8), (10,11,12)) self.assert_unpack("RGB", "XRGB", 4, (2, 3, 4), (6, 7, 8), (10, 11, 12))
self.assert_unpack("RGB", "XBGR", 4, (4,3,2), (8,7,6), (12,11,10)) self.assert_unpack("RGB", "XBGR", 4, (4, 3, 2), (8, 7, 6), (12, 11, 10))
self.assert_unpack("RGB", "YCC;P", self.assert_unpack("RGB", "YCC;P",
b'D]\x9c\x82\x1a\x91\xfaOC\xe7J\x12', # random data b'D]\x9c\x82\x1a\x91\xfaOC\xe7J\x12', # random data
(127,102,0), (192,227,0), (213,255,170), (98,255,133)) (127, 102, 0), (192, 227, 0), (213, 255, 170), (98, 255, 133))
self.assert_unpack("RGB", "R", 1, (1,0,0), (2,0,0), (3,0,0)) self.assert_unpack("RGB", "R", 1, (1, 0, 0), (2, 0, 0), (3, 0, 0))
self.assert_unpack("RGB", "G", 1, (0,1,0), (0,2,0), (0,3,0)) self.assert_unpack("RGB", "G", 1, (0, 1, 0), (0, 2, 0), (0, 3, 0))
self.assert_unpack("RGB", "B", 1, (0,0,1), (0,0,2), (0,0,3)) self.assert_unpack("RGB", "B", 1, (0, 0, 1), (0, 0, 2), (0, 0, 3))
def test_RGBA(self): def test_RGBA(self):
self.assert_unpack("RGBA", "LA", 2, (1,1,1,2), (3,3,3,4), (5,5,5,6)) self.assert_unpack("RGBA", "LA", 2, (1, 1, 1, 2), (3, 3, 3, 4), (5, 5, 5, 6))
self.assert_unpack("RGBA", "LA;16B", 4, self.assert_unpack("RGBA", "LA;16B", 4,
(1,1,1,3), (5,5,5,7), (9,9,9,11)) (1, 1, 1, 3), (5, 5, 5, 7), (9, 9, 9, 11))
self.assert_unpack("RGBA", "RGBA", 4, self.assert_unpack("RGBA", "RGBA", 4,
(1,2,3,4), (5,6,7,8), (9,10,11,12)) (1, 2, 3, 4), (5, 6, 7, 8), (9, 10, 11, 12))
self.assert_unpack("RGBA", "RGBa", 4, self.assert_unpack("RGBA", "RGBa", 4,
(63,127,191,4), (159,191,223,8), (191,212,233,12)) (63, 127, 191, 4), (159, 191, 223, 8), (191, 212, 233, 12))
self.assert_unpack("RGBA", "RGBa", self.assert_unpack("RGBA", "RGBa",
b'\x01\x02\x03\x00\x10\x20\x30\xff', b'\x01\x02\x03\x00\x10\x20\x30\xff',
(0,0,0,0), (16,32,48,255)) (0, 0, 0, 0), (16, 32, 48, 255))
self.assert_unpack("RGBA", "RGBa;16L", 8, self.assert_unpack("RGBA", "RGBa;16L", 8,
(63,127,191,8), (159,191,223,16), (191,212,233,24)) (63, 127, 191, 8), (159, 191, 223, 16), (191, 212, 233, 24))
self.assert_unpack("RGBA", "RGBa;16L", self.assert_unpack("RGBA", "RGBa;16L",
b'\x88\x01\x88\x02\x88\x03\x88\x00' b'\x88\x01\x88\x02\x88\x03\x88\x00'
b'\x88\x10\x88\x20\x88\x30\x88\xff', b'\x88\x10\x88\x20\x88\x30\x88\xff',
(0,0,0,0), (16,32,48,255)) (0, 0, 0, 0), (16, 32, 48, 255))
self.assert_unpack("RGBA", "RGBa;16B", 8, self.assert_unpack("RGBA", "RGBa;16B", 8,
(36,109,182,7), (153,187,221,15), (188,210,232,23)) (36, 109, 182, 7), (153, 187, 221, 15), (188, 210, 232, 23))
self.assert_unpack("RGBA", "RGBa;16B", self.assert_unpack("RGBA", "RGBa;16B",
b'\x01\x88\x02\x88\x03\x88\x00\x88' b'\x01\x88\x02\x88\x03\x88\x00\x88'
b'\x10\x88\x20\x88\x30\x88\xff\x88', b'\x10\x88\x20\x88\x30\x88\xff\x88',
(0,0,0,0), (16,32,48,255)) (0, 0, 0, 0), (16, 32, 48, 255))
self.assert_unpack("RGBA", "BGRa", 4, self.assert_unpack("RGBA", "BGRa", 4,
(191,127,63,4), (223,191,159,8), (233,212,191,12)) (191, 127, 63, 4), (223, 191, 159, 8), (233, 212, 191, 12))
self.assert_unpack("RGBA", "BGRa", self.assert_unpack("RGBA", "BGRa",
b'\x01\x02\x03\x00\x10\x20\x30\xff', b'\x01\x02\x03\x00\x10\x20\x30\xff',
(0,0,0,0), (48,32,16,255)) (0, 0, 0, 0), (48, 32, 16, 255))
self.assert_unpack("RGBA", "RGBA;I", 4, self.assert_unpack("RGBA", "RGBA;I", 4,
(254,253,252,4), (250,249,248,8), (246,245,244,12)) (254, 253, 252, 4), (250, 249, 248, 8), (246, 245, 244, 12))
self.assert_unpack("RGBA", "RGBA;L", 4, self.assert_unpack("RGBA", "RGBA;L", 4,
(1,4,7,10), (2,5,8,11), (3,6,9,12)) (1, 4, 7, 10), (2, 5, 8, 11), (3, 6, 9, 12))
self.assert_unpack("RGBA", "RGBA;15", 2, (8,131,0,0), (24,0,8,0)) self.assert_unpack("RGBA", "RGBA;15", 2, (8, 131, 0, 0), (24, 0, 8, 0))
self.assert_unpack("RGBA", "BGRA;15", 2, (0,131,8,0), (8,0,24,0)) self.assert_unpack("RGBA", "BGRA;15", 2, (0, 131, 8, 0), (8, 0, 24, 0))
self.assert_unpack("RGBA", "RGBA;4B", 2, (17,0,34,0), (51,0,68,0)) self.assert_unpack("RGBA", "RGBA;4B", 2, (17, 0, 34, 0), (51, 0, 68, 0))
self.assert_unpack("RGBA", "RGBA;16L", 8, (2,4,6,8), (10,12,14,16)) self.assert_unpack("RGBA", "RGBA;16L", 8, (2, 4, 6, 8), (10, 12, 14, 16))
self.assert_unpack("RGBA", "RGBA;16B", 8, (1,3,5,7), (9,11,13,15)) self.assert_unpack("RGBA", "RGBA;16B", 8, (1, 3, 5, 7), (9, 11, 13, 15))
self.assert_unpack("RGBA", "BGRA", 4, self.assert_unpack("RGBA", "BGRA", 4,
(3,2,1,4), (7,6,5,8), (11,10,9,12)) (3, 2, 1, 4), (7, 6, 5, 8), (11, 10, 9, 12))
self.assert_unpack("RGBA", "ARGB", 4, self.assert_unpack("RGBA", "ARGB", 4,
(2,3,4,1), (6,7,8,5), (10,11,12,9)) (2, 3, 4, 1), (6, 7, 8, 5), (10, 11, 12, 9))
self.assert_unpack("RGBA", "ABGR", 4, self.assert_unpack("RGBA", "ABGR", 4,
(4,3,2,1), (8,7,6,5), (12,11,10,9)) (4, 3, 2, 1), (8, 7, 6, 5), (12, 11, 10, 9))
self.assert_unpack("RGBA", "YCCA;P", self.assert_unpack("RGBA", "YCCA;P",
b']bE\x04\xdd\xbej\xed57T\xce\xac\xce:\x11', # random data b']bE\x04\xdd\xbej\xed57T\xce\xac\xce:\x11', # random data
(0,161,0,4), (255,255,255,237), (27,158,0,206), (0,118,0,17)) (0, 161, 0, 4), (255, 255, 255, 237), (27, 158, 0, 206), (0, 118, 0, 17))
self.assert_unpack("RGBA", "R", 1, (1,0,0,0), (2,0,0,0), (3,0,0,0)) self.assert_unpack("RGBA", "R", 1, (1, 0, 0, 0), (2, 0, 0, 0), (3, 0, 0, 0))
self.assert_unpack("RGBA", "G", 1, (0,1,0,0), (0,2,0,0), (0,3,0,0)) self.assert_unpack("RGBA", "G", 1, (0, 1, 0, 0), (0, 2, 0, 0), (0, 3, 0, 0))
self.assert_unpack("RGBA", "B", 1, (0,0,1,0), (0,0,2,0), (0,0,3,0)) self.assert_unpack("RGBA", "B", 1, (0, 0, 1, 0), (0, 0, 2, 0), (0, 0, 3, 0))
self.assert_unpack("RGBA", "A", 1, (0,0,0,1), (0,0,0,2), (0,0,0,3)) self.assert_unpack("RGBA", "A", 1, (0, 0, 0, 1), (0, 0, 0, 2), (0, 0, 0, 3))
def test_RGBa(self): def test_RGBa(self):
self.assert_unpack("RGBa", "RGBa", 4, self.assert_unpack("RGBa", "RGBa", 4,
(1,2,3,4), (5,6,7,8), (9,10,11,12)) (1, 2, 3, 4), (5, 6, 7, 8), (9, 10, 11, 12))
self.assert_unpack("RGBa", "BGRa", 4, self.assert_unpack("RGBa", "BGRa", 4,
(3,2,1,4), (7,6,5,8), (11,10,9,12)) (3, 2, 1, 4), (7, 6, 5, 8), (11, 10, 9, 12))
self.assert_unpack("RGBa", "aRGB", 4, self.assert_unpack("RGBa", "aRGB", 4,
(2,3,4,1), (6,7,8,5), (10,11,12,9)) (2, 3, 4, 1), (6, 7, 8, 5), (10, 11, 12, 9))
self.assert_unpack("RGBa", "aBGR", 4, self.assert_unpack("RGBa", "aBGR", 4,
(4,3,2,1), (8,7,6,5), (12,11,10,9)) (4, 3, 2, 1), (8, 7, 6, 5), (12, 11, 10, 9))
def test_RGBX(self): def test_RGBX(self):
self.assert_unpack("RGBX", "RGB", 3, (1,2,3,X), (4,5,6,X), (7,8,9,X)) self.assert_unpack("RGBX", "RGB", 3, (1, 2, 3, X), (4, 5, 6, X), (7, 8, 9, X))
self.assert_unpack("RGBX", "RGB;L", 3, (1,4,7,X), (2,5,8,X), (3,6,9,X)) self.assert_unpack("RGBX", "RGB;L", 3, (1, 4, 7, X), (2, 5, 8, X), (3, 6, 9, X))
self.assert_unpack("RGBX", "RGB;16B", 6, (1,3,5,X), (7,9,11,X)) self.assert_unpack("RGBX", "RGB;16B", 6, (1, 3, 5, X), (7, 9, 11, X))
self.assert_unpack("RGBX", "BGR", 3, (3,2,1,X), (6,5,4,X), (9,8,7,X)) self.assert_unpack("RGBX", "BGR", 3, (3, 2, 1, X), (6, 5, 4, X), (9, 8, 7, X))
self.assert_unpack("RGBX", "RGB;15", 2, (8,131,0,X), (24,0,8,X)) self.assert_unpack("RGBX", "RGB;15", 2, (8, 131, 0, X), (24, 0, 8, X))
self.assert_unpack("RGBX", "BGR;15", 2, (0,131,8,X), (8,0,24,X)) self.assert_unpack("RGBX", "BGR;15", 2, (0, 131, 8, X), (8, 0, 24, X))
self.assert_unpack("RGBX", "RGB;4B", 2, (17,0,34,X), (51,0,68,X)) self.assert_unpack("RGBX", "RGB;4B", 2, (17, 0, 34, X), (51, 0, 68, X))
self.assert_unpack("RGBX", "RGBX", 4, self.assert_unpack("RGBX", "RGBX", 4,
(1,2,3,4), (5,6,7,8), (9,10,11,12)) (1, 2, 3, 4), (5, 6, 7, 8), (9, 10, 11, 12))
self.assert_unpack("RGBX", "RGBXX", 5, self.assert_unpack("RGBX", "RGBXX", 5,
(1,2,3,4), (6,7,8,9), (11,12,13,14)) (1, 2, 3, 4), (6, 7, 8, 9), (11, 12, 13, 14))
self.assert_unpack("RGBX", "RGBXXX", 6, self.assert_unpack("RGBX", "RGBXXX", 6,
(1,2,3,4), (7,8,9,10), (13,14,15,16)) (1, 2, 3, 4), (7, 8, 9, 10), (13, 14, 15, 16))
self.assert_unpack("RGBX", "RGBX;L", 4, self.assert_unpack("RGBX", "RGBX;L", 4,
(1,4,7,10), (2,5,8,11), (3,6,9,12)) (1, 4, 7, 10), (2, 5, 8, 11), (3, 6, 9, 12))
self.assert_unpack("RGBX", "RGBX;16L", 8, (2,4,6,8), (10,12,14,16)) self.assert_unpack("RGBX", "RGBX;16L", 8, (2, 4, 6, 8), (10, 12, 14, 16))
self.assert_unpack("RGBX", "RGBX;16B", 8, (1,3,5,7), (9,11,13,15)) self.assert_unpack("RGBX", "RGBX;16B", 8, (1, 3, 5, 7), (9, 11, 13, 15))
self.assert_unpack("RGBX", "BGRX", 4, (3,2,1,X), (7,6,5,X), (11,10,9,X)) self.assert_unpack("RGBX", "BGRX", 4, (3, 2, 1, X), (7, 6, 5, X), (11, 10, 9, X))
self.assert_unpack("RGBX", "XRGB", 4, (2,3,4,X), (6,7,8,X), (10,11,12,X)) self.assert_unpack("RGBX", "XRGB", 4, (2, 3, 4, X), (6, 7, 8, X), (10, 11, 12, X))
self.assert_unpack("RGBX", "XBGR", 4, (4,3,2,X), (8,7,6,X), (12,11,10,X)) self.assert_unpack("RGBX", "XBGR", 4, (4, 3, 2, X), (8, 7, 6, X), (12, 11, 10, X))
self.assert_unpack("RGBX", "YCC;P", self.assert_unpack("RGBX", "YCC;P",
b'D]\x9c\x82\x1a\x91\xfaOC\xe7J\x12', # random data b'D]\x9c\x82\x1a\x91\xfaOC\xe7J\x12', # random data
(127,102,0,X), (192,227,0,X), (213,255,170,X), (98,255,133,X)) (127, 102, 0, X), (192, 227, 0, X), (213, 255, 170, X), (98, 255, 133, X))
self.assert_unpack("RGBX", "R", 1, (1,0,0,0), (2,0,0,0), (3,0,0,0)) self.assert_unpack("RGBX", "R", 1, (1, 0, 0, 0), (2, 0, 0, 0), (3, 0, 0, 0))
self.assert_unpack("RGBX", "G", 1, (0,1,0,0), (0,2,0,0), (0,3,0,0)) self.assert_unpack("RGBX", "G", 1, (0, 1, 0, 0), (0, 2, 0, 0), (0, 3, 0, 0))
self.assert_unpack("RGBX", "B", 1, (0,0,1,0), (0,0,2,0), (0,0,3,0)) self.assert_unpack("RGBX", "B", 1, (0, 0, 1, 0), (0, 0, 2, 0), (0, 0, 3, 0))
self.assert_unpack("RGBX", "X", 1, (0,0,0,1), (0,0,0,2), (0,0,0,3)) self.assert_unpack("RGBX", "X", 1, (0, 0, 0, 1), (0, 0, 0, 2), (0, 0, 0, 3))
def test_CMYK(self): def test_CMYK(self):
self.assert_unpack("CMYK", "CMYK", 4, self.assert_unpack("CMYK", "CMYK", 4,
(1,2,3,4), (5,6,7,8), (9,10,11,12)) (1, 2, 3, 4), (5, 6, 7, 8), (9, 10, 11, 12))
self.assert_unpack("CMYK", "CMYKX", 5, self.assert_unpack("CMYK", "CMYKX", 5,
(1,2,3,4), (6,7,8,9), (11,12,13,14)) (1, 2, 3, 4), (6, 7, 8, 9), (11, 12, 13, 14))
self.assert_unpack("CMYK", "CMYKXX", 6, self.assert_unpack("CMYK", "CMYKXX", 6,
(1,2,3,4), (7,8,9,10), (13,14,15,16)) (1, 2, 3, 4), (7, 8, 9, 10), (13, 14, 15, 16))
self.assert_unpack("CMYK", "CMYK;I", 4, self.assert_unpack("CMYK", "CMYK;I", 4,
(254,253,252,251), (250,249,248,247), (246,245,244,243)) (254, 253, 252, 251), (250, 249, 248, 247), (246, 245, 244, 243))
self.assert_unpack("CMYK", "CMYK;L", 4, self.assert_unpack("CMYK", "CMYK;L", 4,
(1,4,7,10), (2,5,8,11), (3,6,9,12)) (1, 4, 7, 10), (2, 5, 8, 11), (3, 6, 9, 12))
self.assert_unpack("CMYK", "C", 1, (1,0,0,0), (2,0,0,0), (3,0,0,0)) self.assert_unpack("CMYK", "C", 1, (1, 0, 0, 0), (2, 0, 0, 0), (3, 0, 0, 0))
self.assert_unpack("CMYK", "M", 1, (0,1,0,0), (0,2,0,0), (0,3,0,0)) self.assert_unpack("CMYK", "M", 1, (0, 1, 0, 0), (0, 2, 0, 0), (0, 3, 0, 0))
self.assert_unpack("CMYK", "Y", 1, (0,0,1,0), (0,0,2,0), (0,0,3,0)) self.assert_unpack("CMYK", "Y", 1, (0, 0, 1, 0), (0, 0, 2, 0), (0, 0, 3, 0))
self.assert_unpack("CMYK", "K", 1, (0,0,0,1), (0,0,0,2), (0,0,0,3)) self.assert_unpack("CMYK", "K", 1, (0, 0, 0, 1), (0, 0, 0, 2), (0, 0, 0, 3))
self.assert_unpack("CMYK", "C;I", 1, self.assert_unpack("CMYK", "C;I", 1,
(254,0,0,0), (253,0,0,0), (252,0,0,0)) (254, 0, 0, 0), (253, 0, 0, 0), (252, 0, 0, 0))
self.assert_unpack("CMYK", "M;I", 1, self.assert_unpack("CMYK", "M;I", 1,
(0,254,0,0), (0,253,0,0), (0,252,0,0)) (0, 254, 0, 0), (0, 253, 0, 0), (0, 252, 0, 0))
self.assert_unpack("CMYK", "Y;I", 1, self.assert_unpack("CMYK", "Y;I", 1,
(0,0,254,0), (0,0,253,0), (0,0,252,0)) (0, 0, 254, 0), (0, 0, 253, 0), (0, 0, 252, 0))
self.assert_unpack("CMYK", "K;I", 1, self.assert_unpack("CMYK", "K;I", 1,
(0,0,0,254), (0,0,0,253), (0,0,0,252)) (0, 0, 0, 254), (0, 0, 0, 253), (0, 0, 0, 252))
def test_YCbCr(self): def test_YCbCr(self):
self.assert_unpack("YCbCr", "YCbCr", 3, (1,2,3), (4,5,6), (7,8,9)) self.assert_unpack("YCbCr", "YCbCr", 3, (1, 2, 3), (4, 5, 6), (7, 8, 9))
self.assert_unpack("YCbCr", "YCbCr;L", 3, (1,4,7), (2,5,8), (3,6,9)) self.assert_unpack("YCbCr", "YCbCr;L", 3, (1, 4, 7), (2, 5, 8), (3, 6, 9))
self.assert_unpack("YCbCr", "YCbCrK", 4, (1,2,3), (5,6,7), (9,10,11)) self.assert_unpack("YCbCr", "YCbCrK", 4, (1, 2, 3), (5, 6, 7), (9, 10, 11))
self.assert_unpack("YCbCr", "YCbCrX", 4, (1,2,3), (5,6,7), (9,10,11)) self.assert_unpack("YCbCr", "YCbCrX", 4, (1, 2, 3), (5, 6, 7), (9, 10, 11))
self.assert_unpack("YCbCr", "YCbCrXX", 5, (1,2,3), (6,7,8), (11,12,13)) self.assert_unpack("YCbCr", "YCbCrXX", 5, (1, 2, 3), (6, 7, 8), (11, 12, 13))
self.assert_unpack("YCbCr", "YCbCrXXX", 6, (1,2,3), (7,8,9), (13,14,15)) self.assert_unpack("YCbCr", "YCbCrXXX", 6, (1, 2, 3), (7, 8, 9), (13, 14, 15))
def test_LAB(self): def test_LAB(self):
self.assert_unpack("LAB", "LAB", 3, self.assert_unpack("LAB", "LAB", 3,
(1,130,131), (4,133,134), (7,136,137)) (1, 130, 131), (4, 133, 134), (7, 136, 137))
self.assert_unpack("LAB", "L", 1, (1,0,0), (2,0,0), (3,0,0)) self.assert_unpack("LAB", "L", 1, (1, 0, 0), (2, 0, 0), (3, 0, 0))
self.assert_unpack("LAB", "A", 1, (0,1,0), (0,2,0), (0,3,0)) self.assert_unpack("LAB", "A", 1, (0, 1, 0), (0, 2, 0), (0, 3, 0))
self.assert_unpack("LAB", "B", 1, (0,0,1), (0,0,2), (0,0,3)) self.assert_unpack("LAB", "B", 1, (0, 0, 1), (0, 0, 2), (0, 0, 3))
def test_HSV(self): def test_HSV(self):
self.assert_unpack("HSV", "HSV", 3, (1,2,3), (4,5,6), (7,8,9)) self.assert_unpack("HSV", "HSV", 3, (1, 2, 3), (4, 5, 6), (7, 8, 9))
self.assert_unpack("HSV", "H", 1, (1,0,0), (2,0,0), (3,0,0)) self.assert_unpack("HSV", "H", 1, (1, 0, 0), (2, 0, 0), (3, 0, 0))
self.assert_unpack("HSV", "S", 1, (0,1,0), (0,2,0), (0,3,0)) self.assert_unpack("HSV", "S", 1, (0, 1, 0), (0, 2, 0), (0, 3, 0))
self.assert_unpack("HSV", "V", 1, (0,0,1), (0,0,2), (0,0,3)) self.assert_unpack("HSV", "V", 1, (0, 0, 1), (0, 0, 2), (0, 0, 3))
def test_I(self): def test_I(self):
self.assert_unpack("I", "I;8", 1, 0x01, 0x02, 0x03, 0x04) self.assert_unpack("I", "I;8", 1, 0x01, 0x02, 0x03, 0x04)

View File

@ -214,7 +214,7 @@ class TestNumpy(PillowTestCase):
def test_bool(self): def test_bool(self):
# https://github.com/python-pillow/Pillow/issues/2044 # https://github.com/python-pillow/Pillow/issues/2044
a = numpy.zeros((10,2), dtype=numpy.bool) a = numpy.zeros((10, 2), dtype=numpy.bool)
a[0][0] = True a[0][0] = True
im2 = Image.fromarray(a) im2 = Image.fromarray(a)

View File

@ -92,5 +92,6 @@ class TestPickle(PillowTestCase):
self.helper_pickle_string(cPickle, protocol, mode="L") self.helper_pickle_string(cPickle, protocol, mode="L")
self.helper_pickle_file(cPickle, protocol, mode="L") self.helper_pickle_file(cPickle, protocol, mode="L")
if __name__ == '__main__': if __name__ == '__main__':
unittest.main() unittest.main()

View File

@ -59,5 +59,6 @@ class Test_IFDRational(PillowTestCase):
self.assertEqual(float(IFDRational(301, 1)), self.assertEqual(float(IFDRational(301, 1)),
float(reloaded.tag_v2[282])) float(reloaded.tag_v2[282]))
if __name__ == '__main__': if __name__ == '__main__':
unittest.main() unittest.main()

View File

@ -12,5 +12,6 @@ class TestUploader(PillowTestCase):
target = hopper('RGB') target = hopper('RGB')
self.assert_image_similar(result, target, 0) self.assert_image_similar(result, target, 0)
if __name__ == '__main__': if __name__ == '__main__':
unittest.main() unittest.main()

View File

@ -75,5 +75,6 @@ class TestUtil(PillowTestCase):
# Assert # Assert
self.assertRaises(ValueError, lambda: thing.some_attr) self.assertRaises(ValueError, lambda: thing.some_attr)
if __name__ == '__main__': if __name__ == '__main__':
unittest.main() unittest.main()

View File

@ -4,6 +4,7 @@ from io import BytesIO
test_file = "Tests/images/hopper.webp" test_file = "Tests/images/hopper.webp"
@unittest.skipUnless(features.check('webp'), "WebP is not installed") @unittest.skipUnless(features.check('webp'), "WebP is not installed")
class TestWebPLeaks(PillowLeakTestCase): class TestWebPLeaks(PillowLeakTestCase):

View File

@ -34,6 +34,7 @@ class Worker(threading.Thread):
sys.stdout.write(".") sys.stdout.write(".")
queue.task_done() queue.task_done()
t0 = time.time() t0 = time.time()
threads = 20 threads = 20

View File

@ -7,6 +7,7 @@ def version(module, version):
if v: if v:
print(version, v) print(version, v)
version(Image, "jpeglib") version(Image, "jpeglib")
version(Image, "zlib") version(Image, "zlib")

View File

@ -271,6 +271,7 @@ class DXT5Decoder(ImageFile.PyDecoder):
raise IOError("Truncated DDS file") raise IOError("Truncated DDS file")
return 0, 0 return 0, 0
Image.register_decoder('DXT1', DXT1Decoder) Image.register_decoder('DXT1', DXT1Decoder)
Image.register_decoder('DXT5', DXT5Decoder) Image.register_decoder('DXT5', DXT5Decoder)

View File

@ -788,7 +788,7 @@ try:
setup_requires=pytest_runner, setup_requires=pytest_runner,
tests_require=['pytest'], tests_require=['pytest'],
packages=["PIL"], packages=["PIL"],
package_dir={'':'src'}, package_dir={'': 'src'},
keywords=["Imaging", ], keywords=["Imaging", ],
license='Standard PIL License', license='Standard PIL License',
zip_safe=not (debug_build() or PLATFORM_MINGW), ) zip_safe=not (debug_build() or PLATFORM_MINGW), )

View File

@ -216,6 +216,7 @@ class DibImageFile(BmpImageFile):
# -------------------------------------------------------------------- # --------------------------------------------------------------------
# Write BMP file # Write BMP file
SAVE = { SAVE = {
"1": ("1", 1, 2), "1": ("1", 1, 2),
"L": ("L", 8, 256), "L": ("L", 8, 256),
@ -279,6 +280,7 @@ def _save(im, fp, filename):
# -------------------------------------------------------------------- # --------------------------------------------------------------------
# Registry # Registry
Image.register_open(BmpImageFile.format, BmpImageFile, _accept) Image.register_open(BmpImageFile.format, BmpImageFile, _accept)
Image.register_save(BmpImageFile.format, _save) Image.register_save(BmpImageFile.format, _save)

View File

@ -418,6 +418,7 @@ def _save(im, fp, filename, eps=1):
# #
# -------------------------------------------------------------------- # --------------------------------------------------------------------
Image.register_open(EpsImageFile.format, EpsImageFile, _accept) Image.register_open(EpsImageFile.format, EpsImageFile, _accept)
Image.register_save(EpsImageFile.format, _save) Image.register_save(EpsImageFile.format, _save)

View File

@ -223,6 +223,7 @@ class FpxImageFile(ImageFile.ImageFile):
# #
# -------------------------------------------------------------------- # --------------------------------------------------------------------
Image.register_open(FpxImageFile.format, FpxImageFile, _accept) Image.register_open(FpxImageFile.format, FpxImageFile, _accept)
Image.register_extension(FpxImageFile.format, ".fpx") Image.register_extension(FpxImageFile.format, ".fpx")

View File

@ -89,5 +89,6 @@ class GbrImageFile(ImageFile.ImageFile):
# #
# registry # registry
Image.register_open(GbrImageFile.format, GbrImageFile, _accept) Image.register_open(GbrImageFile.format, GbrImageFile, _accept)
Image.register_extension(GbrImageFile.format, ".gbr") Image.register_extension(GbrImageFile.format, ".gbr")

View File

@ -292,6 +292,7 @@ class GifImageFile(ImageFile.ImageFile):
# -------------------------------------------------------------------- # --------------------------------------------------------------------
# Write GIF files # Write GIF files
RAWMODE = { RAWMODE = {
"1": "L", "1": "L",
"L": "L", "L": "L",

View File

@ -55,6 +55,7 @@ def sphere_increasing(middle, pos):
def sphere_decreasing(middle, pos): def sphere_decreasing(middle, pos):
return 1.0 - sqrt(1.0 - linear(middle, pos) ** 2) return 1.0 - sqrt(1.0 - linear(middle, pos) ** 2)
SEGMENTS = [linear, curved, sine, sphere_increasing, sphere_decreasing] SEGMENTS = [linear, curved, sine, sphere_increasing, sphere_decreasing]

View File

@ -342,6 +342,7 @@ def _save(im, fp, filename):
if retcode: if retcode:
raise CalledProcessError(retcode, convert_cmd) raise CalledProcessError(retcode, convert_cmd)
Image.register_open(IcnsImageFile.format, IcnsImageFile, Image.register_open(IcnsImageFile.format, IcnsImageFile,
lambda x: x[:4] == b'icns') lambda x: x[:4] == b'icns')
Image.register_extension(IcnsImageFile.format, '.icns') Image.register_extension(IcnsImageFile.format, '.icns')

View File

@ -294,6 +294,7 @@ class ImImageFile(ImageFile.ImageFile):
# -------------------------------------------------------------------- # --------------------------------------------------------------------
# Save IM files # Save IM files
SAVE = { SAVE = {
# mode: (im type, raw mode) # mode: (im type, raw mode)
"1": ("0 1", "1"), "1": ("0 1", "1"),
@ -339,6 +340,7 @@ def _save(im, fp, filename):
# -------------------------------------------------------------------- # --------------------------------------------------------------------
# Registry # Registry
Image.register_open(ImImageFile.format, ImImageFile) Image.register_open(ImImageFile.format, ImImageFile)
Image.register_save(ImImageFile.format, _save) Image.register_save(ImImageFile.format, _save)

View File

@ -36,9 +36,11 @@ logger = logging.getLogger(__name__)
class DecompressionBombWarning(RuntimeWarning): class DecompressionBombWarning(RuntimeWarning):
pass pass
class DecompressionBombError(Exception): class DecompressionBombError(Exception):
pass pass
class _imaging_not_installed(object): class _imaging_not_installed(object):
# module placeholder # module placeholder
def __getattr__(self, id): def __getattr__(self, id):
@ -1405,7 +1407,7 @@ class Image(object):
else: else:
self.im.paste(im, box) self.im.paste(im, box)
def alpha_composite(self, im, dest=(0,0), source=(0,0)): def alpha_composite(self, im, dest=(0, 0), source=(0, 0)):
""" 'In-place' analog of Image.alpha_composite. Composites an image """ 'In-place' analog of Image.alpha_composite. Composites an image
onto this image. onto this image.
@ -1436,7 +1438,7 @@ class Image(object):
source = source + im.size source = source + im.size
# over image, crop if it's not the whole thing. # over image, crop if it's not the whole thing.
if source == (0,0) + im.size: if source == (0, 0) + im.size:
overlay = im overlay = im
else: else:
overlay = im.crop(source) overlay = im.crop(source)
@ -1445,7 +1447,7 @@ class Image(object):
box = dest + (dest[0] + overlay.width, dest[1] + overlay.height) box = dest + (dest[0] + overlay.width, dest[1] + overlay.height)
# destination image. don't copy if we're using the whole image. # destination image. don't copy if we're using the whole image.
if box == (0,0) + self.size: if box == (0, 0) + self.size:
background = self background = self
else: else:
background = self.crop(box) background = self.crop(box)
@ -2499,7 +2501,7 @@ def _decompression_bomb_check(size):
raise DecompressionBombError( raise DecompressionBombError(
"Image size (%d pixels) exceeds limit of %d pixels, " "Image size (%d pixels) exceeds limit of %d pixels, "
"could be decompression bomb DOS attack." % "could be decompression bomb DOS attack." %
(pixels, 2* MAX_IMAGE_PIXELS)) (pixels, 2 * MAX_IMAGE_PIXELS))
if pixels > MAX_IMAGE_PIXELS: if pixels > MAX_IMAGE_PIXELS:
warnings.warn( warnings.warn(
@ -2745,6 +2747,7 @@ def register_extension(id, extension):
""" """
EXTENSION[extension.lower()] = id.upper() EXTENSION[extension.lower()] = id.upper()
def register_extensions(id, extensions): def register_extensions(id, extensions):
""" """
Registers image extensions. This function should not be Registers image extensions. This function should not be
@ -2756,6 +2759,7 @@ def register_extensions(id, extensions):
for extension in extensions: for extension in extensions:
register_extension(id, extension) register_extension(id, extension)
def registered_extensions(): def registered_extensions():
""" """
Returns a dictionary containing all file extensions belonging Returns a dictionary containing all file extensions belonging
@ -2886,5 +2890,6 @@ def _apply_env_variables(env=None):
except ValueError as e: except ValueError as e:
warnings.warn("{0}: {1}".format(var_name, e)) warnings.warn("{0}: {1}".format(var_name, e))
_apply_env_variables() _apply_env_variables()
atexit.register(core.clear_cache) atexit.register(core.clear_cache)

View File

@ -554,6 +554,7 @@ def buildProofTransform(
except (IOError, TypeError, ValueError) as v: except (IOError, TypeError, ValueError) as v:
raise PyCMSError(v) raise PyCMSError(v)
buildTransformFromOpenProfiles = buildTransform buildTransformFromOpenProfiles = buildTransform
buildProofTransformFromOpenProfiles = buildProofTransform buildProofTransformFromOpenProfiles = buildProofTransform

View File

@ -139,6 +139,7 @@ def getcolor(color, mode):
return color + (alpha,) return color + (alpha,)
return color return color
colormap = { colormap = {
# X11 colour table from https://drafts.csswg.org/css-color-4/, with # X11 colour table from https://drafts.csswg.org/css-color-4/, with
# gray/grey spelling issues fixed. This is a superset of HTML 4.0 # gray/grey spelling issues fixed. This is a superset of HTML 4.0

View File

@ -33,6 +33,7 @@ import sys
LAYOUT_BASIC = 0 LAYOUT_BASIC = 0
LAYOUT_RAQM = 1 LAYOUT_RAQM = 1
class _imagingft_not_installed(object): class _imagingft_not_installed(object):
# module placeholder # module placeholder
def __getattr__(self, id): def __getattr__(self, id):

View File

@ -235,6 +235,7 @@ def imagemath_max(self, other):
def imagemath_convert(self, mode): def imagemath_convert(self, mode):
return _Operand(self.im.convert(mode)) return _Operand(self.im.convert(mode))
ops = {} ops = {}
for k, v in list(globals().items()): for k, v in list(globals().items()):
if k[:10] == "imagemath_": if k[:10] == "imagemath_":

View File

@ -162,6 +162,7 @@ def _toqclass_helper(im):
'data': __data, 'im': im, 'format': format, 'colortable': colortable 'data': __data, 'im': im, 'format': format, 'colortable': colortable
} }
if qt_is_installed: if qt_is_installed:
class ImageQt(QImage): class ImageQt(QImage):

View File

@ -144,4 +144,5 @@ class Stat(object):
v.append(math.sqrt(self.var[i])) v.append(math.sqrt(self.var[i]))
return v return v
Global = Stat # compatibility Global = Stat # compatibility

View File

@ -266,6 +266,7 @@ def _save(im, fp, filename):
# ------------------------------------------------------------ # ------------------------------------------------------------
# Registry stuff # Registry stuff
Image.register_open(Jpeg2KImageFile.format, Jpeg2KImageFile, _accept) Image.register_open(Jpeg2KImageFile.format, Jpeg2KImageFile, _accept)
Image.register_save(Jpeg2KImageFile.format, _save) Image.register_save(Jpeg2KImageFile.format, _save)

View File

@ -153,6 +153,7 @@ class PSDraw(object):
# Copyright (c) Fredrik Lundh 1994. # Copyright (c) Fredrik Lundh 1994.
# #
EDROFF_PS = """\ EDROFF_PS = """\
/S { show } bind def /S { show } bind def
/P { moveto show } bind def /P { moveto show } bind def

View File

@ -90,6 +90,7 @@ def build_prototype_image():
image.putpalette(palettedata) image.putpalette(palettedata)
return image return image
Palm8BitColormapImage = build_prototype_image() Palm8BitColormapImage = build_prototype_image()
# OK, we now have in Palm8BitColormapImage, # OK, we now have in Palm8BitColormapImage,

View File

@ -110,6 +110,7 @@ class PcxImageFile(ImageFile.ImageFile):
# -------------------------------------------------------------------- # --------------------------------------------------------------------
# save PCX files # save PCX files
SAVE = { SAVE = {
# mode: (version, bits, planes, raw mode) # mode: (version, bits, planes, raw mode)
"1": (2, 1, 1, "1"), "1": (2, 1, 1, "1"),
@ -171,6 +172,7 @@ def _save(im, fp, filename):
# -------------------------------------------------------------------- # --------------------------------------------------------------------
# registry # registry
Image.register_open(PcxImageFile.format, PcxImageFile, _accept) Image.register_open(PcxImageFile.format, PcxImageFile, _accept)
Image.register_save(PcxImageFile.format, _save) Image.register_save(PcxImageFile.format, _save)

View File

@ -263,6 +263,7 @@ def _save(im, fp, filename, save_all=False):
# #
# -------------------------------------------------------------------- # --------------------------------------------------------------------
Image.register_save("PDF", _save) Image.register_save("PDF", _save)
Image.register_save_all("PDF", _save_all) Image.register_save_all("PDF", _save_all)

View File

@ -85,6 +85,7 @@ def _safe_zlib_decompress(s):
raise ValueError("Decompressed Data Too Large") raise ValueError("Decompressed Data Too Large")
return plaintext return plaintext
def _crc32(data, seed=0): def _crc32(data, seed=0):
return zlib.crc32(data, seed) & 0xffffffff return zlib.crc32(data, seed) & 0xffffffff

View File

@ -15,8 +15,6 @@
# #
import string
from . import Image, ImageFile from . import Image, ImageFile
__version__ = "0.2" __version__ = "0.2"
@ -152,6 +150,7 @@ def _save(im, fp, filename):
# #
# -------------------------------------------------------------------- # --------------------------------------------------------------------
Image.register_open(PpmImageFile.format, PpmImageFile, _accept) Image.register_open(PpmImageFile.format, PpmImageFile, _accept)
Image.register_save(PpmImageFile.format, _save) Image.register_save(PpmImageFile.format, _save)

View File

@ -301,6 +301,7 @@ def _maketile(file, mode, bbox, channels):
# -------------------------------------------------------------------- # --------------------------------------------------------------------
# registry # registry
Image.register_open(PsdImageFile.format, PsdImageFile, _accept) Image.register_open(PsdImageFile.format, PsdImageFile, _accept)
Image.register_extension(PsdImageFile.format, ".psd") Image.register_extension(PsdImageFile.format, ".psd")

View File

@ -193,6 +193,7 @@ def _save(im, fp, filename):
fp.close() fp.close()
class SGI16Decoder(ImageFile.PyDecoder): class SGI16Decoder(ImageFile.PyDecoder):
_pulls_fd = True _pulls_fd = True

View File

@ -51,6 +51,7 @@ def isInt(f):
except (ValueError, OverflowError): except (ValueError, OverflowError):
return 0 return 0
iforms = [1, 3, -11, -12, -21, -22] iforms = [1, 3, -11, -12, -21, -22]
@ -279,6 +280,7 @@ def _save_spider(im, fp, filename):
# -------------------------------------------------------------------- # --------------------------------------------------------------------
Image.register_open(SpiderImageFile.format, SpiderImageFile) Image.register_open(SpiderImageFile.format, SpiderImageFile)
Image.register_save(SpiderImageFile.format, _save_spider) Image.register_save(SpiderImageFile.format, _save_spider)

View File

@ -130,6 +130,7 @@ class SunImageFile(ImageFile.ImageFile):
# #
# registry # registry
Image.register_open(SunImageFile.format, SunImageFile, _accept) Image.register_open(SunImageFile.format, SunImageFile, _accept)
Image.register_extension(SunImageFile.format, ".ras") Image.register_extension(SunImageFile.format, ".ras")

View File

@ -130,6 +130,7 @@ class TgaImageFile(ImageFile.ImageFile):
# -------------------------------------------------------------------- # --------------------------------------------------------------------
# Write TGA file # Write TGA file
SAVE = { SAVE = {
"1": ("1", 1, 0, 3), "1": ("1", 1, 0, 3),
"L": ("L", 8, 0, 3), "L": ("L", 8, 0, 3),
@ -186,6 +187,7 @@ def _save(im, fp, filename):
# -------------------------------------------------------------------- # --------------------------------------------------------------------
# Registry # Registry
Image.register_open(TgaImageFile.format, TgaImageFile) Image.register_open(TgaImageFile.format, TgaImageFile)
Image.register_save(TgaImageFile.format, _save) Image.register_save(TgaImageFile.format, _save)

View File

@ -1286,7 +1286,6 @@ class TiffImageFile(ImageFile.ImageFile):
if ';16L' in rawmode: if ';16L' in rawmode:
rawmode = rawmode.replace(';16L', ';16N') rawmode = rawmode.replace(';16L', ';16N')
# Offset in the tile tuple is 0, we go from 0,0 to # Offset in the tile tuple is 0, we go from 0,0 to
# w,h, and we only do this once -- eds # w,h, and we only do this once -- eds
a = (rawmode, self._compression, False) a = (rawmode, self._compression, False)

View File

@ -355,6 +355,7 @@ def _populate():
TAGS_V2[k] = TagInfo(k, *v) TAGS_V2[k] = TagInfo(k, *v)
_populate() _populate()
## ##
# Map type numbers to type names -- defined in ImageFileDirectory. # Map type numbers to type names -- defined in ImageFileDirectory.

View File

@ -74,6 +74,7 @@ def open(filename):
with builtins.open(filename, "rb") as fp: with builtins.open(filename, "rb") as fp:
return imopen(fp) return imopen(fp)
quake2palette = ( quake2palette = (
# default palette taken from piffo 0.93 by Hans Häggström # default palette taken from piffo 0.93 by Hans Häggström
b"\x01\x01\x01\x0b\x0b\x0b\x12\x12\x12\x17\x17\x17\x1b\x1b\x1b\x1e" b"\x01\x01\x01\x0b\x0b\x0b\x12\x12\x12\x17\x17\x17\x1b\x1b\x1b\x1e"

View File

@ -42,6 +42,7 @@ def register_handler(handler):
global _handler global _handler
_handler = handler _handler = handler
if hasattr(Image.core, "drawwmf"): if hasattr(Image.core, "drawwmf"):
# install default handler (windows only) # install default handler (windows only)
@ -161,6 +162,7 @@ def _save(im, fp, filename):
# -------------------------------------------------------------------- # --------------------------------------------------------------------
# Registry stuff # Registry stuff
Image.register_open(WmfStubImageFile.format, WmfStubImageFile, _accept) Image.register_open(WmfStubImageFile.format, WmfStubImageFile, _accept)
Image.register_save(WmfStubImageFile.format, _save) Image.register_save(WmfStubImageFile.format, _save)

View File

@ -121,6 +121,7 @@ class XpmImageFile(ImageFile.ImageFile):
# #
# Registry # Registry
Image.register_open(XpmImageFile.format, XpmImageFile, _accept) Image.register_open(XpmImageFile.format, XpmImageFile, _accept)
Image.register_extension(XpmImageFile.format, ".xpm") Image.register_extension(XpmImageFile.format, ".xpm")

View File

@ -8,6 +8,7 @@ modules = {
"webp": "PIL._webp", "webp": "PIL._webp",
} }
def check_module(feature): def check_module(feature):
if not (feature in modules): if not (feature in modules):
raise ValueError("Unknown module %s" % feature) raise ValueError("Unknown module %s" % feature)
@ -15,14 +16,16 @@ def check_module(feature):
module = modules[feature] module = modules[feature]
try: try:
imported_module = __import__(module) __import__(module)
return True return True
except ImportError: except ImportError:
return False return False
def get_supported_modules(): def get_supported_modules():
return [f for f in modules if check_module(f)] return [f for f in modules if check_module(f)]
codecs = { codecs = {
"jpg": "jpeg", "jpg": "jpeg",
"jpg_2000": "jpeg2k", "jpg_2000": "jpeg2k",
@ -30,6 +33,7 @@ codecs = {
"libtiff": "libtiff" "libtiff": "libtiff"
} }
def check_codec(feature): def check_codec(feature):
if feature not in codecs: if feature not in codecs:
raise ValueError("Unknown codec %s" % feature) raise ValueError("Unknown codec %s" % feature)
@ -42,6 +46,7 @@ def check_codec(feature):
def get_supported_codecs(): def get_supported_codecs():
return [f for f in codecs if check_codec(f)] return [f for f in codecs if check_codec(f)]
features = { features = {
"webp_anim": ("PIL._webp", 'HAVE_WEBPANIM'), "webp_anim": ("PIL._webp", 'HAVE_WEBPANIM'),
"webp_mux": ("PIL._webp", 'HAVE_WEBPMUX'), "webp_mux": ("PIL._webp", 'HAVE_WEBPMUX'),
@ -49,6 +54,7 @@ features = {
"raqm": ("PIL._imagingft", "HAVE_RAQM") "raqm": ("PIL._imagingft", "HAVE_RAQM")
} }
def check_feature(feature): def check_feature(feature):
if feature not in features: if feature not in features:
raise ValueError("Unknown feature %s" % feature) raise ValueError("Unknown feature %s" % feature)
@ -71,9 +77,9 @@ def check(feature):
feature in codecs and check_codec(feature) or \ feature in codecs and check_codec(feature) or \
feature in features and check_feature(feature)) feature in features and check_feature(feature))
def get_supported(): def get_supported():
ret = get_supported_modules() ret = get_supported_modules()
ret.extend(get_supported_features()) ret.extend(get_supported_features())
ret.extend(get_supported_codecs()) ret.extend(get_supported_codecs())
return ret return ret

View File

@ -14,5 +14,6 @@ def fetch(url):
fd.write(content) fd.write(content)
return name return name
if __name__ == '__main__': if __name__ == '__main__':
fetch(sys.argv[1]) fetch(sys.argv[1])

View File

@ -6,5 +6,6 @@ def untar(src, dest):
with tarfile.open(src, 'r:gz') as tgz: with tarfile.open(src, 'r:gz') as tgz:
tgz.extractall(dest) tgz.extractall(dest)
if __name__ == '__main__': if __name__ == '__main__':
untar(sys.argv[1], sys.argv[2]) untar(sys.argv[1], sys.argv[2])

View File

@ -6,5 +6,6 @@ def unzip(src, dest):
with zipfile.ZipFile(src) as zf: with zipfile.ZipFile(src) as zf:
zf.extractall(dest) zf.extractall(dest)
if __name__ == '__main__': if __name__ == '__main__':
unzip(sys.argv[1], sys.argv[2]) unzip(sys.argv[1], sys.argv[2])