Skip to content

Commit 0164158

Browse files
authored
Merge pull request #7209 from Yay295/bytes_tests
2 parents 1de013a + 60976c8 commit 0164158

File tree

2 files changed

+70
-29
lines changed

2 files changed

+70
-29
lines changed

Tests/test_image.py

Lines changed: 59 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -33,36 +33,38 @@
3333
skip_unless_feature,
3434
)
3535

36+
# name, pixel size
37+
image_modes = (
38+
("1", 1),
39+
("L", 1),
40+
("LA", 4),
41+
("La", 4),
42+
("P", 1),
43+
("PA", 4),
44+
("F", 4),
45+
("I", 4),
46+
("I;16", 2),
47+
("I;16L", 2),
48+
("I;16B", 2),
49+
("I;16N", 2),
50+
("RGB", 4),
51+
("RGBA", 4),
52+
("RGBa", 4),
53+
("RGBX", 4),
54+
("BGR;15", 2),
55+
("BGR;16", 2),
56+
("BGR;24", 3),
57+
("CMYK", 4),
58+
("YCbCr", 4),
59+
("HSV", 4),
60+
("LAB", 4),
61+
)
62+
63+
image_mode_names = [name for name, _ in image_modes]
64+
3665

3766
class TestImage:
38-
@pytest.mark.parametrize(
39-
"mode",
40-
(
41-
"1",
42-
"P",
43-
"PA",
44-
"L",
45-
"LA",
46-
"La",
47-
"F",
48-
"I",
49-
"I;16",
50-
"I;16L",
51-
"I;16B",
52-
"I;16N",
53-
"RGB",
54-
"RGBX",
55-
"RGBA",
56-
"RGBa",
57-
"BGR;15",
58-
"BGR;16",
59-
"BGR;24",
60-
"CMYK",
61-
"YCbCr",
62-
"LAB",
63-
"HSV",
64-
),
65-
)
67+
@pytest.mark.parametrize("mode", image_mode_names)
6668
def test_image_modes_success(self, mode: str) -> None:
6769
Image.new(mode, (1, 1))
6870

@@ -1042,6 +1044,35 @@ def test_close_graceful(self, caplog: pytest.LogCaptureFixture) -> None:
10421044
assert im.fp is None
10431045

10441046

1047+
class TestImageBytes:
1048+
@pytest.mark.parametrize("mode", image_mode_names)
1049+
def test_roundtrip_bytes_constructor(self, mode: str) -> None:
1050+
im = hopper(mode)
1051+
source_bytes = im.tobytes()
1052+
1053+
reloaded = Image.frombytes(mode, im.size, source_bytes)
1054+
assert reloaded.tobytes() == source_bytes
1055+
1056+
@pytest.mark.parametrize("mode", image_mode_names)
1057+
def test_roundtrip_bytes_method(self, mode: str) -> None:
1058+
im = hopper(mode)
1059+
source_bytes = im.tobytes()
1060+
1061+
reloaded = Image.new(mode, im.size)
1062+
reloaded.frombytes(source_bytes)
1063+
assert reloaded.tobytes() == source_bytes
1064+
1065+
@pytest.mark.parametrize(("mode", "pixelsize"), image_modes)
1066+
def test_getdata_putdata(self, mode: str, pixelsize: int) -> None:
1067+
im = Image.new(mode, (2, 2))
1068+
source_bytes = bytes(range(im.width * im.height * pixelsize))
1069+
im.frombytes(source_bytes)
1070+
1071+
reloaded = Image.new(mode, im.size)
1072+
reloaded.putdata(im.getdata())
1073+
assert_image_equal(im, reloaded)
1074+
1075+
10451076
class MockEncoder(ImageFile.PyEncoder):
10461077
pass
10471078

src/_imaging.c

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1578,7 +1578,17 @@ if (PySequence_Check(op)) { \
15781578
int bigendian = 0;
15791579
if (image->type == IMAGING_TYPE_SPECIAL) {
15801580
// I;16*
1581-
bigendian = strcmp(image->mode, "I;16B") == 0;
1581+
if (strcmp(image->mode, "I;16N") == 0) {
1582+
#ifdef WORDS_BIGENDIAN
1583+
bigendian = 1;
1584+
#else
1585+
bigendian = 0;
1586+
#endif
1587+
} else if (strcmp(image->mode, "I;16B") == 0) {
1588+
bigendian = 1;
1589+
} else {
1590+
bigendian = 0;
1591+
}
15821592
}
15831593
for (i = x = y = 0; i < n; i++) {
15841594
set_value_to_item(seq, i);

0 commit comments

Comments
 (0)