Merge pull request #856 from megabuz/tgainfo

Fix TGA files with image ID field
This commit is contained in:
Hugo 2014-08-20 09:57:04 +03:00
commit 9f7a382b02
3 changed files with 38 additions and 16 deletions

View File

@ -42,9 +42,6 @@ MODES = {
}
def _accept(prefix):
return prefix[0:1] == b"\0"
##
# Image plugin for Targa files.
@ -58,7 +55,7 @@ class TgaImageFile(ImageFile.ImageFile):
# process header
s = self.fp.read(18)
id = i8(s[0])
idlen = i8(s[0])
colormaptype = i8(s[1])
imagetype = i8(s[2])
@ -70,7 +67,7 @@ class TgaImageFile(ImageFile.ImageFile):
self.size = i16(s[12:]), i16(s[14:])
# validate header fields
if id != 0 or colormaptype not in (0, 1) or\
if colormaptype not in (0, 1) or\
self.size[0] <= 0 or self.size[1] <= 0 or\
depth not in (1, 8, 16, 24, 32):
raise SyntaxError("not a TGA file")
@ -79,7 +76,7 @@ class TgaImageFile(ImageFile.ImageFile):
if imagetype in (3, 11):
self.mode = "L"
if depth == 1:
self.mode = "1" # ???
self.mode = "1" # ???
elif imagetype in (1, 9):
self.mode = "P"
elif imagetype in (2, 10):
@ -103,22 +100,25 @@ class TgaImageFile(ImageFile.ImageFile):
if imagetype & 8:
self.info["compression"] = "tga_rle"
if idlen:
self.info["id_section"] = self.fp.read(idlen)
if colormaptype:
# read palette
start, size, mapdepth = i16(s[3:]), i16(s[5:]), i16(s[7:])
if mapdepth == 16:
self.palette = ImagePalette.raw("BGR;16",
b"\0"*2*start + self.fp.read(2*size))
self.palette = ImagePalette.raw(
"BGR;16", b"\0"*2*start + self.fp.read(2*size))
elif mapdepth == 24:
self.palette = ImagePalette.raw("BGR",
b"\0"*3*start + self.fp.read(3*size))
self.palette = ImagePalette.raw(
"BGR", b"\0"*3*start + self.fp.read(3*size))
elif mapdepth == 32:
self.palette = ImagePalette.raw("BGRA",
b"\0"*4*start + self.fp.read(4*size))
self.palette = ImagePalette.raw(
"BGRA", b"\0"*4*start + self.fp.read(4*size))
# setup tile descriptor
try:
rawmode = MODES[(imagetype&7, depth)]
rawmode = MODES[(imagetype & 7, depth)]
if imagetype & 8:
# compressed
self.tile = [("tga_rle", (0, 0)+self.size,
@ -127,7 +127,7 @@ class TgaImageFile(ImageFile.ImageFile):
self.tile = [("raw", (0, 0)+self.size,
self.fp.tell(), (rawmode, 0, orientation))]
except KeyError:
pass # cannot decode
pass # cannot decode
#
# --------------------------------------------------------------------
@ -145,6 +145,7 @@ SAVE = {
"RGBA": ("BGRA", 32, 0, 2),
}
def _save(im, fp, filename, check=0):
try:
@ -185,13 +186,14 @@ def _save(im, fp, filename, check=0):
if colormaptype:
fp.write(im.im.getpalette("RGB", "BGR"))
ImageFile._save(im, fp, [("raw", (0,0)+im.size, 0, (rawmode, 0, orientation))])
ImageFile._save(
im, fp, [("raw", (0, 0) + im.size, 0, (rawmode, 0, orientation))])
#
# --------------------------------------------------------------------
# Registry
Image.register_open("TGA", TgaImageFile, _accept)
Image.register_open("TGA", TgaImageFile)
Image.register_save("TGA", _save)
Image.register_extension("TGA", ".tga")

Binary file not shown.

20
Tests/test_file_tga.py Normal file
View File

@ -0,0 +1,20 @@
from helper import unittest, PillowTestCase
from PIL import Image
class TestFileTga(PillowTestCase):
def test_id_field(self):
# tga file with id field
test_file = "Tests/images/tga_id_field.tga"
# Act
im = Image.open(test_file)
# Assert
self.assertEqual(im.size, (100, 100))
if __name__ == '__main__':
unittest.main()