Pillow/Tests/test_image_convert.py

237 lines
6.8 KiB
Python
Raw Normal View History

from helper import unittest, PillowTestCase, hopper
from PIL import Image
2014-05-18 00:33:50 +04:00
2014-06-10 13:10:47 +04:00
class TestImageConvert(PillowTestCase):
2014-06-10 13:10:47 +04:00
def test_sanity(self):
2014-06-10 13:10:47 +04:00
def convert(im, mode):
out = im.convert(mode)
self.assertEqual(out.mode, mode)
self.assertEqual(out.size, im.size)
2014-06-10 13:10:47 +04:00
modes = "1", "L", "I", "F", "RGB", "RGBA", "RGBX", "CMYK", "YCbCr"
2014-06-10 13:10:47 +04:00
for mode in modes:
im = hopper(mode)
2014-06-10 13:10:47 +04:00
for mode in modes:
convert(im, mode)
2014-05-18 00:33:50 +04:00
# Check 0
2017-01-29 15:03:38 +03:00
im = Image.new(mode, (0, 0))
for mode in modes:
convert(im, mode)
2017-01-29 15:03:38 +03:00
2014-06-10 13:10:47 +04:00
def test_default(self):
im = hopper("P")
2014-06-10 13:10:47 +04:00
self.assert_image(im, "P", im.size)
im = im.convert()
self.assert_image(im, "RGB", im.size)
im = im.convert()
self.assert_image(im, "RGB", im.size)
2014-05-18 00:33:50 +04:00
2014-06-10 13:10:47 +04:00
# ref https://github.com/python-pillow/Pillow/issues/274
2014-06-10 13:10:47 +04:00
def _test_float_conversion(self, im):
orig = im.getpixel((5, 5))
converted = im.convert('F').getpixel((5, 5))
self.assertEqual(orig, converted)
2014-05-18 00:33:50 +04:00
2014-06-10 13:10:47 +04:00
def test_8bit(self):
im = Image.open('Tests/images/hopper.jpg')
2014-06-10 13:10:47 +04:00
self._test_float_conversion(im.convert('L'))
2014-05-17 20:08:08 +04:00
2014-06-10 13:10:47 +04:00
def test_16bit(self):
im = Image.open('Tests/images/16bit.cropped.tif')
self._test_float_conversion(im)
2014-05-18 00:33:50 +04:00
2014-06-10 13:10:47 +04:00
def test_16bit_workaround(self):
im = Image.open('Tests/images/16bit.cropped.tif')
self._test_float_conversion(im.convert('I'))
2014-06-10 13:10:47 +04:00
def test_rgba_p(self):
im = hopper('RGBA')
im.putalpha(hopper('L'))
2014-03-26 08:42:04 +04:00
2014-06-10 13:10:47 +04:00
converted = im.convert('P')
comparable = converted.convert('RGBA')
2014-05-17 20:08:08 +04:00
2014-06-10 13:10:47 +04:00
self.assert_image_similar(im, comparable, 20)
2014-05-18 00:33:50 +04:00
2014-06-10 13:10:47 +04:00
def test_trns_p(self):
im = hopper('P')
2014-06-10 13:10:47 +04:00
im.info['transparency'] = 0
2014-03-26 10:33:49 +04:00
2014-06-10 13:10:47 +04:00
f = self.tempfile('temp.png')
2014-03-26 10:33:49 +04:00
2018-06-15 16:44:22 +03:00
im_l = im.convert('L')
self.assertEqual(im_l.info['transparency'], 0) # undone
im_l.save(f)
2014-03-26 10:33:49 +04:00
2018-06-15 16:44:22 +03:00
im_rgb = im.convert('RGB')
self.assertEqual(im_rgb.info['transparency'], (0, 0, 0)) # undone
im_rgb.save(f)
2014-05-17 20:08:08 +04:00
2014-06-10 13:10:47 +04:00
# ref https://github.com/python-pillow/Pillow/issues/664
2014-05-17 20:08:08 +04:00
2014-06-10 13:10:47 +04:00
def test_trns_p_rgba(self):
# Arrange
im = hopper('P')
2014-06-10 13:10:47 +04:00
im.info['transparency'] = 128
2014-05-18 00:33:50 +04:00
2014-06-10 13:10:47 +04:00
# Act
2018-06-15 16:44:22 +03:00
im_rgba = im.convert('RGBA')
2014-05-17 20:08:08 +04:00
2014-06-10 13:10:47 +04:00
# Assert
2018-06-15 16:44:22 +03:00
self.assertNotIn('transparency', im_rgba.info)
# https://github.com/python-pillow/Pillow/issues/2702
2018-06-15 16:44:22 +03:00
self.assertEqual(im_rgba.palette, None)
2018-01-27 09:07:24 +03:00
2014-06-10 13:10:47 +04:00
def test_trns_l(self):
im = hopper('L')
2014-06-10 13:10:47 +04:00
im.info['transparency'] = 128
2014-05-17 20:08:08 +04:00
2014-06-10 13:10:47 +04:00
f = self.tempfile('temp.png')
2014-05-17 20:08:08 +04:00
2018-06-15 16:44:22 +03:00
im_rgb = im.convert('RGB')
self.assertEqual(im_rgb.info['transparency'],
(128, 128, 128)) # undone
im_rgb.save(f)
2014-03-26 10:33:49 +04:00
2018-06-15 16:44:22 +03:00
im_p = im.convert('P')
self.assertIn('transparency', im_p.info)
im_p.save(f)
2014-05-17 20:08:08 +04:00
2018-06-15 16:44:22 +03:00
im_p = self.assert_warning(
2014-06-10 13:10:47 +04:00
UserWarning,
2017-09-01 14:05:40 +03:00
im.convert, 'P', palette=Image.ADAPTIVE)
2018-06-15 16:44:22 +03:00
self.assertNotIn('transparency', im_p.info)
im_p.save(f)
2014-06-10 13:10:47 +04:00
def test_trns_RGB(self):
im = hopper('RGB')
2014-06-10 13:10:47 +04:00
im.info['transparency'] = im.getpixel((0, 0))
2014-06-10 13:10:47 +04:00
f = self.tempfile('temp.png')
2018-06-15 16:44:22 +03:00
im_l = im.convert('L')
self.assertEqual(im_l.info['transparency'],
im_l.getpixel((0, 0))) # undone
im_l.save(f)
2014-05-17 20:08:08 +04:00
2018-06-15 16:44:22 +03:00
im_p = im.convert('P')
self.assertIn('transparency', im_p.info)
im_p.save(f)
2014-03-26 10:33:49 +04:00
2018-06-15 16:44:22 +03:00
im_rgba = im.convert('RGBA')
self.assertNotIn('transparency', im_rgba.info)
im_rgba.save(f)
2018-06-15 16:44:22 +03:00
im_p = self.assert_warning(
2014-06-10 13:10:47 +04:00
UserWarning,
2017-09-01 14:05:40 +03:00
im.convert, 'P', palette=Image.ADAPTIVE)
2018-06-15 16:44:22 +03:00
self.assertNotIn('transparency', im_p.info)
im_p.save(f)
2014-05-17 20:08:08 +04:00
def test_gif_with_rgba_palette_to_p(self):
# See https://github.com/python-pillow/Pillow/issues/2433
im = Image.open('Tests/images/hopper.gif')
im.info['transparency'] = 255
im.load()
self.assertEqual(im.palette.mode, 'RGBA')
im_p = im.convert('P')
# Should not raise ValueError: unrecognized raw mode
im_p.load()
2016-06-26 13:50:38 +03:00
def test_p_la(self):
im = hopper('RGBA')
alpha = hopper('L')
im.putalpha(alpha)
2017-08-09 02:36:07 +03:00
comparable = im.convert('P').convert('LA').getchannel('A')
self.assert_image_similar(alpha, comparable, 5)
2016-06-26 13:50:38 +03:00
2017-01-29 15:03:38 +03:00
def test_matrix_illegal_conversion(self):
# Arrange
im = hopper('CMYK')
matrix = (
0.412453, 0.357580, 0.180423, 0,
0.212671, 0.715160, 0.072169, 0,
0.019334, 0.119193, 0.950227, 0)
self.assertNotEqual(im.mode, 'RGB')
# Act / Assert
self.assertRaises(ValueError,
2017-09-01 14:05:40 +03:00
im.convert, mode='CMYK', matrix=matrix)
2017-01-29 15:03:38 +03:00
def test_matrix_wrong_mode(self):
# Arrange
im = hopper('L')
matrix = (
0.412453, 0.357580, 0.180423, 0,
0.212671, 0.715160, 0.072169, 0,
0.019334, 0.119193, 0.950227, 0)
self.assertEqual(im.mode, 'L')
# Act / Assert
self.assertRaises(ValueError,
2017-09-01 14:05:40 +03:00
im.convert, mode='L', matrix=matrix)
2017-01-30 15:27:29 +03:00
def test_matrix_xyz(self):
def matrix_convert(mode):
# Arrange
im = hopper('RGB')
im.info['transparency'] = (255, 0, 0)
matrix = (
0.412453, 0.357580, 0.180423, 0,
0.212671, 0.715160, 0.072169, 0,
0.019334, 0.119193, 0.950227, 0)
self.assertEqual(im.mode, 'RGB')
# Act
# Convert an RGB image to the CIE XYZ colour space
converted_im = im.convert(mode=mode, matrix=matrix)
# Assert
self.assertEqual(converted_im.mode, mode)
self.assertEqual(converted_im.size, im.size)
target = Image.open('Tests/images/hopper-XYZ.png')
2017-01-30 15:27:29 +03:00
if converted_im.mode == 'RGB':
self.assert_image_similar(converted_im, target, 3)
2018-09-27 13:35:00 +03:00
self.assertEqual(converted_im.info['transparency'],
(105, 54, 4))
else:
2018-06-24 15:32:25 +03:00
self.assert_image_similar(converted_im,
target.getchannel(0), 1)
self.assertEqual(converted_im.info['transparency'], 105)
matrix_convert('RGB')
matrix_convert('L')
2017-01-29 15:03:38 +03:00
2017-01-30 15:28:00 +03:00
def test_matrix_identity(self):
# Arrange
im = hopper('RGB')
identity_matrix = (
1, 0, 0, 0,
0, 1, 0, 0,
0, 0, 1, 0)
self.assertEqual(im.mode, 'RGB')
# Act
# Convert with an identity matrix
converted_im = im.convert(mode='RGB', matrix=identity_matrix)
# Assert
# No change
self.assert_image_equal(converted_im, im)
2014-06-10 13:10:47 +04:00
if __name__ == '__main__':
unittest.main()