Skip to content

Commit 50e0c85

Browse files
authored
Merge pull request #6500 from radarhere/tga
2 parents 1d1a22b + 8b2d70d commit 50e0c85

File tree

4 files changed

+41
-12
lines changed

4 files changed

+41
-12
lines changed

Tests/test_file_bmp.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,18 @@ def test_save_to_bytes():
5858
assert reloaded.format == "BMP"
5959

6060

61+
def test_small_palette(tmp_path):
62+
im = Image.new("P", (1, 1))
63+
colors = [0, 0, 0, 125, 125, 125, 255, 255, 255]
64+
im.putpalette(colors)
65+
66+
out = str(tmp_path / "temp.bmp")
67+
im.save(out)
68+
69+
with Image.open(out) as reloaded:
70+
assert reloaded.getpalette() == colors
71+
72+
6173
def test_save_too_large(tmp_path):
6274
outfile = str(tmp_path / "temp.bmp")
6375
with Image.new("RGB", (1, 1)) as im:

Tests/test_file_tga.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,18 @@ def test_save(tmp_path):
120120
assert test_im.size == (100, 100)
121121

122122

123+
def test_small_palette(tmp_path):
124+
im = Image.new("P", (1, 1))
125+
colors = [0, 0, 0]
126+
im.putpalette(colors)
127+
128+
out = str(tmp_path / "temp.tga")
129+
im.save(out)
130+
131+
with Image.open(out) as reloaded:
132+
assert reloaded.getpalette() == colors
133+
134+
123135
def test_save_wrong_mode(tmp_path):
124136
im = hopper("PA")
125137
out = str(tmp_path / "temp.tga")

src/PIL/BmpImagePlugin.py

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -375,6 +375,16 @@ def _save(im, fp, filename, bitmap_header=True):
375375
header = 40 # or 64 for OS/2 version 2
376376
image = stride * im.size[1]
377377

378+
if im.mode == "1":
379+
palette = b"".join(o8(i) * 4 for i in (0, 255))
380+
elif im.mode == "L":
381+
palette = b"".join(o8(i) * 4 for i in range(256))
382+
elif im.mode == "P":
383+
palette = im.im.getpalette("RGB", "BGRX")
384+
colors = len(palette) // 4
385+
else:
386+
palette = None
387+
378388
# bitmap header
379389
if bitmap_header:
380390
offset = 14 + header + colors * 4
@@ -405,14 +415,8 @@ def _save(im, fp, filename, bitmap_header=True):
405415

406416
fp.write(b"\0" * (header - 40)) # padding (for OS/2 format)
407417

408-
if im.mode == "1":
409-
for i in (0, 255):
410-
fp.write(o8(i) * 4)
411-
elif im.mode == "L":
412-
for i in range(256):
413-
fp.write(o8(i) * 4)
414-
elif im.mode == "P":
415-
fp.write(im.im.getpalette("RGB", "BGRX"))
418+
if palette:
419+
fp.write(palette)
416420

417421
ImageFile._save(im, fp, [("raw", (0, 0) + im.size, 0, (rawmode, stride, -1))])
418422

src/PIL/TgaImagePlugin.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -193,9 +193,10 @@ def _save(im, fp, filename):
193193
warnings.warn("id_section has been trimmed to 255 characters")
194194

195195
if colormaptype:
196-
colormapfirst, colormaplength, colormapentry = 0, 256, 24
196+
palette = im.im.getpalette("RGB", "BGR")
197+
colormaplength, colormapentry = len(palette) // 3, 24
197198
else:
198-
colormapfirst, colormaplength, colormapentry = 0, 0, 0
199+
colormaplength, colormapentry = 0, 0
199200

200201
if im.mode in ("LA", "RGBA"):
201202
flags = 8
@@ -210,7 +211,7 @@ def _save(im, fp, filename):
210211
o8(id_len)
211212
+ o8(colormaptype)
212213
+ o8(imagetype)
213-
+ o16(colormapfirst)
214+
+ o16(0) # colormapfirst
214215
+ o16(colormaplength)
215216
+ o8(colormapentry)
216217
+ o16(0)
@@ -225,7 +226,7 @@ def _save(im, fp, filename):
225226
fp.write(id_section)
226227

227228
if colormaptype:
228-
fp.write(im.im.getpalette("RGB", "BGR"))
229+
fp.write(palette)
229230

230231
if rle:
231232
ImageFile._save(

0 commit comments

Comments
 (0)