@@ -260,18 +260,21 @@ class BlpImageFile(ImageFile.ImageFile):
260260 def _open (self ) -> None :
261261 self .magic = self .fp .read (4 )
262262
263- self .fp .seek (5 , os .SEEK_CUR )
264- (self ._blp_alpha_depth ,) = struct .unpack ("<b" , self .fp .read (1 ))
265-
266- self .fp .seek (2 , os .SEEK_CUR )
267- self ._size = struct .unpack ("<II" , self .fp .read (8 ))
268-
269- if self .magic in (b"BLP1" , b"BLP2" ):
270- decoder = self .magic .decode ()
263+ if self .magic == b"BLP1" :
264+ self .fp .seek (4 , os .SEEK_CUR )
265+ (self ._blp_alpha_depth ,) = struct .unpack ("<I" , self .fp .read (4 ))
266+ elif self .magic == b"BLP2" :
267+ self .fp .seek (5 , os .SEEK_CUR )
268+ (self ._blp_alpha_depth ,) = struct .unpack ("<b" , self .fp .read (1 ))
269+ self .fp .seek (2 , os .SEEK_CUR )
271270 else :
272271 msg = f"Bad BLP magic { repr (self .magic )} "
273272 raise BLPFormatError (msg )
274273
274+ self ._size = struct .unpack ("<II" , self .fp .read (8 ))
275+
276+ decoder = self .magic .decode ()
277+
275278 self ._mode = "RGBA" if self ._blp_alpha_depth else "RGB"
276279 self .tile = [ImageFile ._Tile (decoder , (0 , 0 ) + self .size , 0 , self .mode )]
277280
@@ -297,10 +300,13 @@ def _read_blp_header(self) -> None:
297300 self .fd .seek (4 )
298301 (self ._blp_compression ,) = struct .unpack ("<i" , self ._safe_read (4 ))
299302
300- (self ._blp_encoding ,) = struct .unpack ("<b" , self ._safe_read (1 ))
301- (self ._blp_alpha_depth ,) = struct .unpack ("<b" , self ._safe_read (1 ))
302- (self ._blp_alpha_encoding ,) = struct .unpack ("<b" , self ._safe_read (1 ))
303- self .fd .seek (1 , os .SEEK_CUR ) # mips
303+ if isinstance (self , BLP1Decoder ):
304+ (self ._blp_alpha_depth ,) = struct .unpack ("<I" , self ._safe_read (4 ))
305+ else :
306+ (self ._blp_encoding ,) = struct .unpack ("<b" , self ._safe_read (1 ))
307+ (self ._blp_alpha_depth ,) = struct .unpack ("<b" , self ._safe_read (1 ))
308+ (self ._blp_alpha_encoding ,) = struct .unpack ("<b" , self ._safe_read (1 ))
309+ self .fd .seek (1 , os .SEEK_CUR ) # mips
304310
305311 self .size = struct .unpack ("<II" , self ._safe_read (8 ))
306312
@@ -472,10 +478,15 @@ def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None:
472478
473479 assert im .palette is not None
474480 fp .write (struct .pack ("<i" , 1 )) # Uncompressed or DirectX compression
475- fp .write (struct .pack ("<b" , Encoding .UNCOMPRESSED ))
476- fp .write (struct .pack ("<b" , 1 if im .palette .mode == "RGBA" else 0 ))
477- fp .write (struct .pack ("<b" , 0 )) # alpha encoding
478- fp .write (struct .pack ("<b" , 0 )) # mips
481+
482+ alpha_depth = 1 if im .palette .mode == "RGBA" else 0
483+ if magic == b"BLP1" :
484+ fp .write (struct .pack ("<L" , alpha_depth ))
485+ else :
486+ fp .write (struct .pack ("<b" , Encoding .UNCOMPRESSED ))
487+ fp .write (struct .pack ("<b" , alpha_depth ))
488+ fp .write (struct .pack ("<b" , 0 )) # alpha encoding
489+ fp .write (struct .pack ("<b" , 0 )) # mips
479490 fp .write (struct .pack ("<II" , * im .size ))
480491 if magic == b"BLP1" :
481492 fp .write (struct .pack ("<i" , 5 ))
0 commit comments