## The Python Imaging Library.# $Id$## Sun image file handling## History:# 1995-09-10 fl Created# 1996-05-28 fl Fixed 32-bit alignment# 1998-12-29 fl Import ImagePalette module# 2001-12-18 fl Fixed palette loading (from Jean-Claude Rimbault)## Copyright (c) 1997-2001 by Secret Labs AB# Copyright (c) 1995-1996 by Fredrik Lundh## See the README file for information on usage and redistribution.#from__future__importannotationsfrom.importImage,ImageFile,ImagePalettefrom._binaryimporti32beasi32def_accept(prefix:bytes)->bool:returnlen(prefix)>=4andi32(prefix)==0x59A66A95### Image plugin for Sun raster files.
[docs]classSunImageFile(ImageFile.ImageFile):format="SUN"format_description="Sun Raster File"def_open(self)->None:# The Sun Raster file header is 32 bytes in length# and has the following format:# typedef struct _SunRaster# {# DWORD MagicNumber; /* Magic (identification) number */# DWORD Width; /* Width of image in pixels */# DWORD Height; /* Height of image in pixels */# DWORD Depth; /* Number of bits per pixel */# DWORD Length; /* Size of image data in bytes */# DWORD Type; /* Type of raster file */# DWORD ColorMapType; /* Type of color map */# DWORD ColorMapLength; /* Size of the color map in bytes */# } SUNRASTER;assertself.fpisnotNone# HEADs=self.fp.read(32)ifnot_accept(s):msg="not an SUN raster file"raiseSyntaxError(msg)offset=32self._size=i32(s,4),i32(s,8)depth=i32(s,12)# data_length = i32(s, 16) # unreliable, ignore.file_type=i32(s,20)palette_type=i32(s,24)# 0: None, 1: RGB, 2: Raw/arbitrarypalette_length=i32(s,28)ifdepth==1:self._mode,rawmode="1","1;I"elifdepth==4:self._mode,rawmode="L","L;4"elifdepth==8:self._mode=rawmode="L"elifdepth==24:iffile_type==3:self._mode,rawmode="RGB","RGB"else:self._mode,rawmode="RGB","BGR"elifdepth==32:iffile_type==3:self._mode,rawmode="RGB","RGBX"else:self._mode,rawmode="RGB","BGRX"else:msg="Unsupported Mode/Bit Depth"raiseSyntaxError(msg)ifpalette_length:ifpalette_length>1024:msg="Unsupported Color Palette Length"raiseSyntaxError(msg)ifpalette_type!=1:msg="Unsupported Palette Type"raiseSyntaxError(msg)offset=offset+palette_lengthself.palette=ImagePalette.raw("RGB;L",self.fp.read(palette_length))ifself.mode=="L":self._mode="P"rawmode=rawmode.replace("L","P")# 16 bit boundaries on stridestride=((self.size[0]*depth+15)//16)*2# file type: Type is the version (or flavor) of the bitmap# file. The following values are typically found in the Type# field:# 0000h Old# 0001h Standard# 0002h Byte-encoded# 0003h RGB format# 0004h TIFF format# 0005h IFF format# FFFFh Experimental# Old and standard are the same, except for the length tag.# byte-encoded is run-length-encoded# RGB looks similar to standard, but RGB byte order# TIFF and IFF mean that they were converted from T/IFF# Experimental means that it's something else.# (https://www.fileformat.info/format/sunraster/egff.htm)iffile_typein(0,1,3,4,5):self.tile=[ImageFile._Tile("raw",(0,0)+self.size,offset,(rawmode,stride))]eliffile_type==2:self.tile=[ImageFile._Tile("sun_rle",(0,0)+self.size,offset,rawmode)]else:msg="Unsupported Sun Raster file type"raiseSyntaxError(msg)