@@ -260,18 +260,21 @@ class BlpImageFile(ImageFile.ImageFile):
260
260
def _open (self ) -> None :
261
261
self .magic = self .fp .read (4 )
262
262
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 )
271
270
else :
272
271
msg = f"Bad BLP magic { repr (self .magic )} "
273
272
raise BLPFormatError (msg )
274
273
274
+ self ._size = struct .unpack ("<II" , self .fp .read (8 ))
275
+
276
+ decoder = self .magic .decode ()
277
+
275
278
self ._mode = "RGBA" if self ._blp_alpha_depth else "RGB"
276
279
self .tile = [ImageFile ._Tile (decoder , (0 , 0 ) + self .size , 0 , self .mode )]
277
280
@@ -297,10 +300,13 @@ def _read_blp_header(self) -> None:
297
300
self .fd .seek (4 )
298
301
(self ._blp_compression ,) = struct .unpack ("<i" , self ._safe_read (4 ))
299
302
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
304
310
305
311
self .size = struct .unpack ("<II" , self ._safe_read (8 ))
306
312
@@ -472,10 +478,15 @@ def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None:
472
478
473
479
assert im .palette is not None
474
480
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
479
490
fp .write (struct .pack ("<II" , * im .size ))
480
491
if magic == b"BLP1" :
481
492
fp .write (struct .pack ("<i" , 5 ))
0 commit comments