forked from python-pillow/Pillow
-
-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathtest_file_tga.py
223 lines (161 loc) · 6.66 KB
/
test_file_tga.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
import os
from glob import glob
from itertools import product
import pytest
from PIL import Image
from .helper import assert_image_equal, assert_image_equal_tofile, hopper
_TGA_DIR = os.path.join("Tests", "images", "tga")
_TGA_DIR_COMMON = os.path.join(_TGA_DIR, "common")
_MODES = ("L", "LA", "P", "RGB", "RGBA")
_ORIGINS = ("tl", "bl")
_ORIGIN_TO_ORIENTATION = {"tl": 1, "bl": -1}
def test_sanity(tmp_path):
for mode in _MODES:
def roundtrip(original_im):
out = str(tmp_path / "temp.tga")
original_im.save(out, rle=rle)
with Image.open(out) as saved_im:
if rle:
assert (
saved_im.info["compression"] == original_im.info["compression"]
)
assert saved_im.info["orientation"] == original_im.info["orientation"]
if mode == "P":
assert saved_im.getpalette() == original_im.getpalette()
assert_image_equal(saved_im, original_im)
png_paths = glob(os.path.join(_TGA_DIR_COMMON, f"*x*_{mode.lower()}.png"))
for png_path in png_paths:
with Image.open(png_path) as reference_im:
assert reference_im.mode == mode
path_no_ext = os.path.splitext(png_path)[0]
for origin, rle in product(_ORIGINS, (True, False)):
tga_path = "{}_{}_{}.tga".format(
path_no_ext, origin, "rle" if rle else "raw"
)
with Image.open(tga_path) as original_im:
assert original_im.format == "TGA"
assert original_im.get_format_mimetype() == "image/x-tga"
if rle:
assert original_im.info["compression"] == "tga_rle"
assert (
original_im.info["orientation"]
== _ORIGIN_TO_ORIENTATION[origin]
)
if mode == "P":
assert original_im.getpalette() == reference_im.getpalette()
assert_image_equal(original_im, reference_im)
roundtrip(original_im)
def test_palette_depth_16(tmp_path):
with Image.open("Tests/images/p_16.tga") as im:
assert_image_equal_tofile(im.convert("RGB"), "Tests/images/p_16.png")
out = str(tmp_path / "temp.png")
im.save(out)
with Image.open(out) as reloaded:
assert_image_equal_tofile(reloaded.convert("RGB"), "Tests/images/p_16.png")
def test_id_field():
# tga file with id field
test_file = "Tests/images/tga_id_field.tga"
# Act
with Image.open(test_file) as im:
# Assert
assert im.size == (100, 100)
def test_id_field_rle():
# tga file with id field
test_file = "Tests/images/rgb32rle.tga"
# Act
with Image.open(test_file) as im:
# Assert
assert im.size == (199, 199)
def test_save(tmp_path):
test_file = "Tests/images/tga_id_field.tga"
with Image.open(test_file) as im:
out = str(tmp_path / "temp.tga")
# Save
im.save(out)
with Image.open(out) as test_im:
assert test_im.size == (100, 100)
assert test_im.info["id_section"] == im.info["id_section"]
# RGBA save
im.convert("RGBA").save(out)
with Image.open(out) as test_im:
assert test_im.size == (100, 100)
def test_save_wrong_mode(tmp_path):
im = hopper("PA")
out = str(tmp_path / "temp.tga")
with pytest.raises(OSError):
im.save(out)
def test_save_mapdepth():
# This image has been manually hexedited from 200x32_p_bl_raw.tga
# to include an origin
test_file = "Tests/images/200x32_p_bl_raw_origin.tga"
with Image.open(test_file) as im:
assert_image_equal_tofile(im, "Tests/images/tga/common/200x32_p.png")
def test_save_id_section(tmp_path):
test_file = "Tests/images/rgb32rle.tga"
with Image.open(test_file) as im:
out = str(tmp_path / "temp.tga")
# Check there is no id section
im.save(out)
with Image.open(out) as test_im:
assert "id_section" not in test_im.info
# Save with custom id section
im.save(out, id_section=b"Test content")
with Image.open(out) as test_im:
assert test_im.info["id_section"] == b"Test content"
# Save with custom id section greater than 255 characters
id_section = b"Test content" * 25
pytest.warns(UserWarning, lambda: im.save(out, id_section=id_section))
with Image.open(out) as test_im:
assert test_im.info["id_section"] == id_section[:255]
test_file = "Tests/images/tga_id_field.tga"
with Image.open(test_file) as im:
# Save with no id section
im.save(out, id_section="")
with Image.open(out) as test_im:
assert "id_section" not in test_im.info
def test_save_orientation(tmp_path):
test_file = "Tests/images/rgb32rle.tga"
out = str(tmp_path / "temp.tga")
with Image.open(test_file) as im:
assert im.info["orientation"] == -1
im.save(out, orientation=1)
with Image.open(out) as test_im:
assert test_im.info["orientation"] == 1
def test_save_rle(tmp_path):
test_file = "Tests/images/rgb32rle.tga"
with Image.open(test_file) as im:
assert im.info["compression"] == "tga_rle"
out = str(tmp_path / "temp.tga")
# Save
im.save(out)
with Image.open(out) as test_im:
assert test_im.size == (199, 199)
assert test_im.info["compression"] == "tga_rle"
# Save without compression
im.save(out, compression=None)
with Image.open(out) as test_im:
assert "compression" not in test_im.info
# RGBA save
im.convert("RGBA").save(out)
with Image.open(out) as test_im:
assert test_im.size == (199, 199)
test_file = "Tests/images/tga_id_field.tga"
with Image.open(test_file) as im:
assert "compression" not in im.info
# Save with compression
im.save(out, compression="tga_rle")
with Image.open(out) as test_im:
assert test_im.info["compression"] == "tga_rle"
def test_save_l_transparency(tmp_path):
# There are 559 transparent pixels in la.tga.
num_transparent = 559
in_file = "Tests/images/la.tga"
with Image.open(in_file) as im:
assert im.mode == "LA"
assert im.getchannel("A").getcolors()[0][0] == num_transparent
out = str(tmp_path / "temp.tga")
im.save(out)
with Image.open(out) as test_im:
assert test_im.mode == "LA"
assert test_im.getchannel("A").getcolors()[0][0] == num_transparent
assert_image_equal(im, test_im)