123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136 |
- from . import Image, ImageFile, ImagePalette
- from ._binary import i32be as i32
- def _accept(prefix):
- return len(prefix) >= 4 and i32(prefix) == 0x59A66A95
- class SunImageFile(ImageFile.ImageFile):
- format = "SUN"
- format_description = "Sun Raster File"
- def _open(self):
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- s = self.fp.read(32)
- if not _accept(s):
- raise SyntaxError("not an SUN raster file")
- offset = 32
- self._size = i32(s, 4), i32(s, 8)
- depth = i32(s, 12)
-
- file_type = i32(s, 20)
- palette_type = i32(s, 24)
- palette_length = i32(s, 28)
- if depth == 1:
- self.mode, rawmode = "1", "1;I"
- elif depth == 4:
- self.mode, rawmode = "L", "L;4"
- elif depth == 8:
- self.mode = rawmode = "L"
- elif depth == 24:
- if file_type == 3:
- self.mode, rawmode = "RGB", "RGB"
- else:
- self.mode, rawmode = "RGB", "BGR"
- elif depth == 32:
- if file_type == 3:
- self.mode, rawmode = "RGB", "RGBX"
- else:
- self.mode, rawmode = "RGB", "BGRX"
- else:
- raise SyntaxError("Unsupported Mode/Bit Depth")
- if palette_length:
- if palette_length > 1024:
- raise SyntaxError("Unsupported Color Palette Length")
- if palette_type != 1:
- raise SyntaxError("Unsupported Palette Type")
- offset = offset + palette_length
- self.palette = ImagePalette.raw("RGB;L", self.fp.read(palette_length))
- if self.mode == "L":
- self.mode = "P"
- rawmode = rawmode.replace("L", "P")
-
- stride = ((self.size[0] * depth + 15) // 16) * 2
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- if file_type in (0, 1, 3, 4, 5):
- self.tile = [("raw", (0, 0) + self.size, offset, (rawmode, stride))]
- elif file_type == 2:
- self.tile = [("sun_rle", (0, 0) + self.size, offset, rawmode)]
- else:
- raise SyntaxError("Unsupported Sun Raster file type")
- Image.register_open(SunImageFile.format, SunImageFile, _accept)
- Image.register_extension(SunImageFile.format, ".ras")
|