Merge pull request #2262 from wiredfool/zero_size

Allow 0 size images, Fixes #2259
This commit is contained in:
wiredfool 2016-12-31 16:35:14 +00:00 committed by GitHub
commit c7df6287fa
8 changed files with 70 additions and 5 deletions

View File

@ -1994,8 +1994,8 @@ def _check_size(size):
raise ValueError("Size must be a tuple") raise ValueError("Size must be a tuple")
if len(size) != 2: if len(size) != 2:
raise ValueError("Size must be a tuple of length 2") raise ValueError("Size must be a tuple of length 2")
if size[0] <= 0 or size[1] <= 0: if size[0] < 0 or size[1] < 0:
raise ValueError("Width and Height must be > 0") raise ValueError("Width and Height must be => 0")
return True return True

View File

@ -256,7 +256,11 @@ class TestImage(PillowTestCase):
with self.assertRaises(ValueError): with self.assertRaises(ValueError):
Image.new('RGB', (0,)) # Tuple too short Image.new('RGB', (0,)) # Tuple too short
with self.assertRaises(ValueError): with self.assertRaises(ValueError):
Image.new('RGB', (0,0)) # w,h <= 0 Image.new('RGB', (-1,-1)) # w,h < 0
# this should pass with 0 sized images, #2259
im = Image.new('L', (0, 0))
self.assertEqual(im.size, (0, 0))
self.assertTrue(Image.new('RGB', (1,1))) self.assertTrue(Image.new('RGB', (1,1)))
# Should pass lists too # Should pass lists too

View File

@ -78,12 +78,25 @@ class TestImageGetPixel(AccessTest):
im.getpixel((0, 0)), c, im.getpixel((0, 0)), c,
"put/getpixel roundtrip failed for mode %s, color %s" % (mode, c)) "put/getpixel roundtrip failed for mode %s, color %s" % (mode, c))
# Check 0
im = Image.new(mode, (0, 0), None)
with self.assertRaises(IndexError):
im.putpixel((0, 0), c)
with self.assertRaises(IndexError):
im.getpixel((0, 0))
# check initial color # check initial color
im = Image.new(mode, (1, 1), c) im = Image.new(mode, (1, 1), c)
self.assertEqual( self.assertEqual(
im.getpixel((0, 0)), c, im.getpixel((0, 0)), c,
"initial color failed for mode %s, color %s " % (mode, c)) "initial color failed for mode %s, color %s " % (mode, c))
# Check 0
im = Image.new(mode, (0, 0), c)
with self.assertRaises(IndexError):
im.getpixel((0, 0))
def test_basic(self): def test_basic(self):
for mode in ("1", "L", "LA", "I", "I;16", "I;16B", "F", for mode in ("1", "L", "LA", "I", "I;16", "I;16B", "F",
"P", "PA", "RGB", "RGBA", "RGBX", "CMYK", "YCbCr"): "P", "PA", "RGB", "RGBA", "RGBX", "CMYK", "YCbCr"):

View File

@ -19,6 +19,11 @@ class TestImageConvert(PillowTestCase):
for mode in modes: for mode in modes:
convert(im, mode) convert(im, mode)
# Check 0
im = Image.new(mode, (0,0))
for mode in modes:
convert(im, mode)
def test_default(self): def test_default(self):
im = hopper("P") im = hopper("P")

View File

@ -1,5 +1,7 @@
from helper import unittest, PillowTestCase, hopper from helper import unittest, PillowTestCase, hopper
from PIL import Image
import copy import copy
@ -33,5 +35,12 @@ class TestImageCopy(PillowTestCase):
self.assertEqual(out.mode, im.mode) self.assertEqual(out.mode, im.mode)
self.assertEqual(out.size, croppedSize) self.assertEqual(out.size, croppedSize)
def test_copy_zero(self):
im = Image.new('RGB', (0,0))
out = im.copy()
self.assertEqual(out.mode, im.mode)
self.assertEqual(out.size, im.size)
if __name__ == '__main__': if __name__ == '__main__':
unittest.main() unittest.main()

View File

@ -83,6 +83,23 @@ class TestImageCrop(PillowTestCase):
img = img.crop(extents) img = img.crop(extents)
img.load() img.load()
def test_crop_zero(self):
im = Image.new('RGB', (0, 0), 'white')
cropped = im.crop((0, 0, 0, 0))
self.assertEqual(cropped.size, (0, 0))
cropped = im.crop((10, 10, 20, 20))
self.assertEqual(cropped.size, (10, 10))
self.assertEqual(cropped.getdata()[0], (0, 0, 0))
im = Image.new('RGB', (0, 0))
cropped = im.crop((10, 10, 20, 20))
self.assertEqual(cropped.size, (10, 10))
self.assertEqual(cropped.getdata()[2], (0, 0, 0))
if __name__ == '__main__': if __name__ == '__main__':

View File

@ -89,6 +89,14 @@ class TestImagingCoreResize(PillowTestCase):
# as separately resized channel # as separately resized channel
self.assert_image_equal(ch, references[channels[i]]) self.assert_image_equal(ch, references[channels[i]])
def test_enlarge_zero(self):
for f in [Image.NEAREST, Image.BOX, Image.BILINEAR, Image.HAMMING,
Image.BICUBIC, Image.LANCZOS]:
r = self.resize(Image.new('RGB', (0,0), "white"), (212, 195), f)
self.assertEqual(r.mode, "RGB")
self.assertEqual(r.size, (212, 195))
self.assertEqual(r.getdata()[0], (0,0,0))
class TestImageResize(PillowTestCase): class TestImageResize(PillowTestCase):

View File

@ -13,15 +13,24 @@ class TestImageRotate(PillowTestCase):
self.assertEqual(out.mode, mode) self.assertEqual(out.mode, mode)
if angle % 180 == 0: if angle % 180 == 0:
self.assertEqual(out.size, im.size) self.assertEqual(out.size, im.size)
elif im.size == (0, 0):
self.assertEqual(out.size, im.size)
else: else:
self.assertNotEqual(out.size, im.size) self.assertNotEqual(out.size, im.size)
for mode in "1", "P", "L", "RGB", "I", "F":
for mode in ("1", "P", "L", "RGB", "I", "F"):
im = hopper(mode) im = hopper(mode)
rotate(im, mode, 45) rotate(im, mode, 45)
for angle in 0, 90, 180, 270:
for angle in (0, 90, 180, 270):
im = Image.open('Tests/images/test-card.png') im = Image.open('Tests/images/test-card.png')
rotate(im, im.mode, angle) rotate(im, im.mode, angle)
for angle in (0, 45, 90, 180, 270):
im = Image.new('RGB',(0,0))
rotate(im, im.mode, angle)
if __name__ == '__main__': if __name__ == '__main__':
unittest.main() unittest.main()