mirror of
				https://github.com/python-pillow/Pillow.git
				synced 2025-10-31 16:07:30 +03:00 
			
		
		
		
	Merge pull request #856 from megabuz/tgainfo
Fix TGA files with image ID field
This commit is contained in:
		
						commit
						9f7a382b02
					
				|  | @ -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") | ||||
|  |  | |||
							
								
								
									
										
											BIN
										
									
								
								Tests/images/tga_id_field.tga
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								Tests/images/tga_id_field.tga
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										20
									
								
								Tests/test_file_tga.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								Tests/test_file_tga.py
									
									
									
									
									
										Normal 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() | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user