from tester import * from PIL import Image def test_extent(): im = lena('RGB') (w,h) = im.size transformed = im.transform(im.size, Image.EXTENT, (0,0, w//2,h//2), # ul -> lr Image.BILINEAR) scaled = im.resize((w*2, h*2), Image.BILINEAR).crop((0,0,w,h)) assert_image_similar(transformed, scaled, 10) # undone -- precision? def test_quad(): # one simple quad transform, equivalent to scale & crop upper left quad im = lena('RGB') (w,h) = im.size transformed = im.transform(im.size, Image.QUAD, (0,0,0,h//2, w//2,h//2,w//2,0), # ul -> ccw around quad Image.BILINEAR) scaled = im.resize((w*2, h*2), Image.BILINEAR).crop((0,0,w,h)) assert_image_equal(transformed, scaled) def test_mesh(): # this should be a checkerboard of halfsized lenas in ul, lr im = lena('RGBA') (w,h) = im.size transformed = im.transform(im.size, Image.MESH, [((0,0,w//2,h//2), # box (0,0,0,h, w,h,w,0)), # ul -> ccw around quad ((w//2,h//2,w,h), # box (0,0,0,h, w,h,w,0))], # ul -> ccw around quad Image.BILINEAR) #transformed.save('transformed.png') scaled = im.resize((w//2, h//2), Image.BILINEAR) checker = Image.new('RGBA', im.size) checker.paste(scaled, (0,0)) checker.paste(scaled, (w//2,h//2)) assert_image_equal(transformed, checker) # now, check to see that the extra area is (0,0,0,0) blank = Image.new('RGBA', (w//2,h//2), (0,0,0,0)) assert_image_equal(blank, transformed.crop((w//2,0,w,h//2))) assert_image_equal(blank, transformed.crop((0,h//2,w//2,h))) def _test_alpha_premult(op): # create image with half white, half black, with the black half transparent. # do op, # there should be no darkness in the white section. im = Image.new('RGBA', (10,10), (0,0,0,0)); im2 = Image.new('RGBA', (5,10), (255,255,255,255)); im.paste(im2, (0,0)) im = op(im, (40,10)) im_background = Image.new('RGB', (40,10), (255,255,255)) im_background.paste(im, (0,0), im) hist = im_background.histogram() assert_equal(40*10, hist[-1]) def test_alpha_premult_resize(): def op (im, sz): return im.resize(sz, Image.LINEAR) _test_alpha_premult(op) def test_alpha_premult_transform(): def op(im, sz): (w,h) = im.size return im.transform(sz, Image.EXTENT, (0,0, w,h), Image.BILINEAR) _test_alpha_premult(op) def test_blank_fill(): # attempting to hit # https://github.com/python-pillow/Pillow/issues/254 reported # # issue is that transforms with transparent overflow area # contained junk from previous images, especially on systems with # constrained memory. So, attempt to fill up memory with a # pattern, free it, and then run the mesh test again. Using a 1Mp # image with 4 bands, for 4 megs of data allocated, x 64. OMM (64 # bit 12.04 VM with 512 megs available, this fails with Pillow < # a0eaf06cc5f62a6fb6de556989ac1014ff3348ea # # Running by default, but I'd totally understand not doing it in # the future foo = [Image.new('RGBA',(1024,1024), (a,a,a,a)) for a in range(1,65)] # Yeah. Watch some JIT optimize this out. foo = None test_mesh()