Skip to content

Commit b89cc09

Browse files
committed
Corrected BLP1 alpha depth handling
1 parent aa0f412 commit b89cc09

File tree

2 files changed

+28
-16
lines changed

2 files changed

+28
-16
lines changed

Tests/test_file_blp.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ def test_load_blp1() -> None:
1919
assert_image_equal_tofile(im, "Tests/images/blp/blp1_jpeg.png")
2020

2121
with Image.open("Tests/images/blp/blp1_jpeg2.blp") as im:
22+
assert im.mode == "RGBA"
2223
im.load()
2324

2425

src/PIL/BlpImagePlugin.py

Lines changed: 27 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)