Skip to content

Commit

Permalink
Merge pull request #6500 from radarhere/tga
Browse files Browse the repository at this point in the history
  • Loading branch information
hugovk committed Sep 16, 2022
2 parents 1d1a22b + 8b2d70d commit 50e0c85
Show file tree
Hide file tree
Showing 4 changed files with 41 additions and 12 deletions.
12 changes: 12 additions & 0 deletions Tests/test_file_bmp.py
Expand Up @@ -58,6 +58,18 @@ def test_save_to_bytes():
assert reloaded.format == "BMP"


def test_small_palette(tmp_path):
im = Image.new("P", (1, 1))
colors = [0, 0, 0, 125, 125, 125, 255, 255, 255]
im.putpalette(colors)

out = str(tmp_path / "temp.bmp")
im.save(out)

with Image.open(out) as reloaded:
assert reloaded.getpalette() == colors


def test_save_too_large(tmp_path):
outfile = str(tmp_path / "temp.bmp")
with Image.new("RGB", (1, 1)) as im:
Expand Down
12 changes: 12 additions & 0 deletions Tests/test_file_tga.py
Expand Up @@ -120,6 +120,18 @@ def test_save(tmp_path):
assert test_im.size == (100, 100)


def test_small_palette(tmp_path):
im = Image.new("P", (1, 1))
colors = [0, 0, 0]
im.putpalette(colors)

out = str(tmp_path / "temp.tga")
im.save(out)

with Image.open(out) as reloaded:
assert reloaded.getpalette() == colors


def test_save_wrong_mode(tmp_path):
im = hopper("PA")
out = str(tmp_path / "temp.tga")
Expand Down
20 changes: 12 additions & 8 deletions src/PIL/BmpImagePlugin.py
Expand Up @@ -375,6 +375,16 @@ def _save(im, fp, filename, bitmap_header=True):
header = 40 # or 64 for OS/2 version 2
image = stride * im.size[1]

if im.mode == "1":
palette = b"".join(o8(i) * 4 for i in (0, 255))
elif im.mode == "L":
palette = b"".join(o8(i) * 4 for i in range(256))
elif im.mode == "P":
palette = im.im.getpalette("RGB", "BGRX")
colors = len(palette) // 4
else:
palette = None

# bitmap header
if bitmap_header:
offset = 14 + header + colors * 4
Expand Down Expand Up @@ -405,14 +415,8 @@ def _save(im, fp, filename, bitmap_header=True):

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

if im.mode == "1":
for i in (0, 255):
fp.write(o8(i) * 4)
elif im.mode == "L":
for i in range(256):
fp.write(o8(i) * 4)
elif im.mode == "P":
fp.write(im.im.getpalette("RGB", "BGRX"))
if palette:
fp.write(palette)

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

Expand Down
9 changes: 5 additions & 4 deletions src/PIL/TgaImagePlugin.py
Expand Up @@ -193,9 +193,10 @@ def _save(im, fp, filename):
warnings.warn("id_section has been trimmed to 255 characters")

if colormaptype:
colormapfirst, colormaplength, colormapentry = 0, 256, 24
palette = im.im.getpalette("RGB", "BGR")
colormaplength, colormapentry = len(palette) // 3, 24
else:
colormapfirst, colormaplength, colormapentry = 0, 0, 0
colormaplength, colormapentry = 0, 0

if im.mode in ("LA", "RGBA"):
flags = 8
Expand All @@ -210,7 +211,7 @@ def _save(im, fp, filename):
o8(id_len)
+ o8(colormaptype)
+ o8(imagetype)
+ o16(colormapfirst)
+ o16(0) # colormapfirst
+ o16(colormaplength)
+ o8(colormapentry)
+ o16(0)
Expand All @@ -225,7 +226,7 @@ def _save(im, fp, filename):
fp.write(id_section)

if colormaptype:
fp.write(im.im.getpalette("RGB", "BGR"))
fp.write(palette)

if rle:
ImageFile._save(
Expand Down

0 comments on commit 50e0c85

Please sign in to comment.