diff --git a/Tests/test_lib_pack.py b/Tests/test_lib_pack.py index 83872c5d1..9c7f348ee 100644 --- a/Tests/test_lib_pack.py +++ b/Tests/test_lib_pack.py @@ -71,73 +71,6 @@ class TestLibPack(PillowTestCase): return im.getpixel((0, 0)) - def unpack_1(mode, rawmode, value): - assert mode == "1" - im = None - - if py3: - im = Image.frombytes( - mode, (8, 1), bytes([value]), "raw", rawmode, 0, 1) - else: - im = Image.frombytes( - mode, (8, 1), chr(value), "raw", rawmode, 0, 1) - - return tuple(im.getdata()) - - X = 255 - - self.assertEqual(unpack_1("1", "1", 1), (0, 0, 0, 0, 0, 0, 0, X)) - self.assertEqual(unpack_1("1", "1;I", 1), (X, X, X, X, X, X, X, 0)) - self.assertEqual(unpack_1("1", "1;R", 1), (X, 0, 0, 0, 0, 0, 0, 0)) - self.assertEqual(unpack_1("1", "1;IR", 1), (0, X, X, X, X, X, X, X)) - - self.assertEqual(unpack_1("1", "1", 170), (X, 0, X, 0, X, 0, X, 0)) - self.assertEqual(unpack_1("1", "1;I", 170), (0, X, 0, X, 0, X, 0, X)) - self.assertEqual(unpack_1("1", "1;R", 170), (0, X, 0, X, 0, X, 0, X)) - self.assertEqual(unpack_1("1", "1;IR", 170), (X, 0, X, 0, X, 0, X, 0)) - - self.assertEqual(unpack("L", "L;2", 1), 0) - self.assertEqual(unpack("L", "L;4", 1), 0) - self.assertEqual(unpack("L", "L", 1), 1) - self.assertEqual(unpack("L", "L;I", 1), 254) - self.assertEqual(unpack("L", "L;R", 1), 128) - self.assertEqual(unpack("L", "L;16", 2), 2) # little endian - self.assertEqual(unpack("L", "L;16B", 2), 1) # big endian - - self.assertEqual(unpack("LA", "LA", 2), (1, 2)) - self.assertEqual(unpack("LA", "LA;L", 2), (1, 2)) - - self.assertEqual(unpack("RGB", "RGB", 3), (1, 2, 3)) - self.assertEqual(unpack("RGB", "RGB;L", 3), (1, 2, 3)) - self.assertEqual(unpack("RGB", "RGB;R", 3), (128, 64, 192)) - self.assertEqual(unpack("RGB", "RGB;16B", 6), (1, 3, 5)) # ? - self.assertEqual(unpack("RGB", "BGR", 3), (3, 2, 1)) - self.assertEqual(unpack("RGB", "RGB;15", 2), (8, 131, 0)) - self.assertEqual(unpack("RGB", "BGR;15", 2), (0, 131, 8)) - self.assertEqual(unpack("RGB", "RGB;16", 2), (8, 64, 0)) - self.assertEqual(unpack("RGB", "BGR;16", 2), (0, 64, 8)) - self.assertEqual(unpack("RGB", "RGB;4B", 2), (17, 0, 34)) - - self.assertEqual(unpack("RGB", "RGBX", 4), (1, 2, 3)) - self.assertEqual(unpack("RGB", "BGRX", 4), (3, 2, 1)) - self.assertEqual(unpack("RGB", "XRGB", 4), (2, 3, 4)) - self.assertEqual(unpack("RGB", "XBGR", 4), (4, 3, 2)) - - self.assertEqual(unpack("RGBA", "RGBA", 4), (1, 2, 3, 4)) - self.assertEqual(unpack("RGBA", "RGBa", 4), (63, 127, 191, 4)) - self.assertEqual(unpack("RGBA", "BGRA", 4), (3, 2, 1, 4)) - self.assertEqual(unpack("RGBA", "BGRa", 4), (191, 127, 63, 4)) - self.assertEqual(unpack("RGBA", "ARGB", 4), (2, 3, 4, 1)) - self.assertEqual(unpack("RGBA", "ABGR", 4), (4, 3, 2, 1)) - self.assertEqual(unpack("RGBA", "RGBA;15", 2), (8, 131, 0, 0)) - self.assertEqual(unpack("RGBA", "BGRA;15", 2), (0, 131, 8, 0)) - self.assertEqual(unpack("RGBA", "RGBA;4B", 2), (17, 0, 34, 0)) - - self.assertEqual(unpack("RGBa", "RGBa", 4), (1, 2, 3, 4)) - self.assertEqual(unpack("RGBa", "BGRa", 4), (3, 2, 1, 4)) - self.assertEqual(unpack("RGBa", "aRGB", 4), (2, 3, 4, 1)) - self.assertEqual(unpack("RGBa", "aBGR", 4), (4, 3, 2, 1)) - self.assertEqual(unpack("RGBX", "RGBX", 4), (1, 2, 3, 4)) # 4->255? self.assertEqual(unpack("RGBX", "BGRX", 4), (3, 2, 1, 255)) self.assertEqual(unpack("RGBX", "XRGB", 4), (2, 3, 4, 255)) @@ -154,5 +87,134 @@ class TestLibPack(PillowTestCase): self.assertRaises(ValueError, lambda: unpack("CMYK", "CMYK", 2)) +class TestLibUnpack(PillowTestCase): + def assert_unpack(self, mode, rawmode, data, *pixels): + """ + data - eather raw bytes with data or just number of bytes in rawmode. + """ + if isinstance(data, (int)): + data_len = data * len(pixels) + data = bytes(bytearray(range(1, data_len + 1))) + + im = Image.frombytes(mode, (len(pixels), 1), data, "raw", rawmode, 0, 1) + + for x, pixel in enumerate(pixels): + self.assertEqual(pixel, im.getpixel((x, 0))) + + def test_1(self): + X = 255 + + self.assert_unpack("1", "1", b'\x01', 0, 0, 0, 0, 0, 0, 0, X) + self.assert_unpack("1", "1;I", b'\x01', X, X, X, X, X, X, X, 0) + self.assert_unpack("1", "1;R", b'\x01', X, 0, 0, 0, 0, 0, 0, 0) + self.assert_unpack("1", "1;IR", b'\x01', 0, X, X, X, X, X, X, X) + + self.assert_unpack("1", "1", b'\xaa', X, 0, X, 0, X, 0, X, 0) + self.assert_unpack("1", "1;I", b'\xaa', 0, X, 0, X, 0, X, 0, X) + self.assert_unpack("1", "1;R", b'\xaa', 0, X, 0, X, 0, X, 0, X) + self.assert_unpack("1", "1;IR", b'\xaa', X, 0, X, 0, X, 0, X, 0) + + self.assert_unpack("1", "1;8", b'\x00\x01\x02\xff', 0, X, X, X) + + def test_L(self): + self.assert_unpack("L", "L;2", b'\xe4', 255, 170, 85, 0) + self.assert_unpack("L", "L;2I", b'\xe4', 0, 85, 170, 255) + self.assert_unpack("L", "L;2R", b'\xe4', 0, 170, 85, 255) + self.assert_unpack("L", "L;2IR", b'\xe4', 255, 85, 170, 0) + + self.assert_unpack("L", "L;4", b'\x02\xef', 0, 34, 238, 255) + self.assert_unpack("L", "L;4I", b'\x02\xef', 255, 221, 17, 0) + self.assert_unpack("L", "L;4R", b'\x02\xef', 68, 0, 255, 119) + self.assert_unpack("L", "L;4IR", b'\x02\xef', 187, 255, 0, 136) + + self.assert_unpack("L", "L", 1, 1, 2, 3, 4) + self.assert_unpack("L", "L;I", 1, 254, 253, 252, 251) + self.assert_unpack("L", "L;R", 1, 128, 64, 192, 32) + self.assert_unpack("L", "L;16", 2, 2, 4, 6, 8) + self.assert_unpack("L", "L;16B", 2, 1, 3, 5, 7) + + def test_LA(self): + 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)) + + def test_P(self): + self.assert_unpack("P", "P;1", b'\xe4', 1, 1, 1, 0, 0, 1, 0, 0) + self.assert_unpack("P", "P;2", b'\xe4', 3, 2, 1, 0) + # self.assert_unpack("P", "P;2L", b'\xe4', 1, 1, 1, 0) # erroneous? + self.assert_unpack("P", "P;4", b'\x02\xef', 0, 2, 14, 15) + # self.assert_unpack("P", "P;4L", b'\x02\xef', 2, 10, 10, 0) # erroneous? + self.assert_unpack("P", "P", 1, 1, 2, 3, 4) + self.assert_unpack("P", "P;R", 1, 128, 64, 192, 32) + + def test_PA(self): + self.assert_unpack("PA", "PA", 2, (1, 2), (3, 4), (5, 6)) + self.assert_unpack("PA", "PA;L", 2, (1, 4), (2, 5), (3, 6)) + + def test_RGB(self): + 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;R", 3, (128,64,192), (32,160,96)) + 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", "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", "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", "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;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", "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", "YCC;P", + b'D]\x9c\x82\x1a\x91\xfaOC\xe7J\x12', # random data + (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", "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)) + + 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;16B", 4, + (1,1,1,3), (5,5,5,7), (9,9,9,11)) + self.assert_unpack("RGBA", "RGBA", 4, + (1,2,3,4), (5,6,7,8), (9,10,11,12)) + self.assert_unpack("RGBA", "RGBa", 4, + (63,127,191,4), (159,191,223,8), (191,212,233,12)) + self.assert_unpack("RGBA", "BGRa", 4, + (191,127,63,4), (223,191,159,8), (233,212,191,12)) + self.assert_unpack("RGBA", "RGBA;I", 4, + (254,253,252,4), (250,249,248,8), (246,245,244,12)) + self.assert_unpack("RGBA", "RGBA;L", 4, + (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", "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;16B", 8, (1,3,5,7), (9,11,13,15)) + self.assert_unpack("RGBA", "BGRA", 4, + (3,2,1,4), (7,6,5,8), (11,10,9,12)) + self.assert_unpack("RGBA", "ARGB", 4, + (2,3,4,1), (6,7,8,5), (10,11,12,9)) + self.assert_unpack("RGBA", "ABGR", 4, + (4,3,2,1), (8,7,6,5), (12,11,10,9)) + self.assert_unpack("RGBA", "YCCA;P", + 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)) + 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", "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)) + + def test_RGBa(self): + self.assert_unpack("RGBa", "RGBa", 4, + (1,2,3,4), (5,6,7,8), (9,10,11,12)) + self.assert_unpack("RGBa", "BGRa", 4, + (3,2,1,4), (7,6,5,8), (11,10,9,12)) + self.assert_unpack("RGBa", "aRGB", 4, + (2,3,4,1), (6,7,8,5), (10,11,12,9)) + self.assert_unpack("RGBa", "aBGR", 4, + (4,3,2,1), (8,7,6,5), (12,11,10,9)) + + if __name__ == '__main__': unittest.main()