From 2b9d48403a2c46d719e7174ddf530b313f487426 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 14 Jul 2022 07:08:25 +1000 Subject: [PATCH 1/2] Reordered SUPPORTED to match MASK_MODES --- src/PIL/BmpImagePlugin.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/PIL/BmpImagePlugin.py b/src/PIL/BmpImagePlugin.py index 5aacb10da8c..5e7c2be1b8b 100644 --- a/src/PIL/BmpImagePlugin.py +++ b/src/PIL/BmpImagePlugin.py @@ -172,10 +172,10 @@ def _bitmap(self, header=0, offset=0): SUPPORTED = { 32: [ (0xFF0000, 0xFF00, 0xFF, 0x0), - (0xFF0000, 0xFF00, 0xFF, 0xFF000000), + (0xFF000000, 0xFF0000, 0xFF00, 0x0), (0xFF, 0xFF00, 0xFF0000, 0xFF000000), + (0xFF0000, 0xFF00, 0xFF, 0xFF000000), (0x0, 0x0, 0x0, 0x0), - (0xFF000000, 0xFF0000, 0xFF00, 0x0), ], 24: [(0xFF0000, 0xFF00, 0xFF)], 16: [(0xF800, 0x7E0, 0x1F), (0x7C00, 0x3E0, 0x1F)], From 9f6a3150924ffa3209a5ed45918315afd864a2a0 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 14 Jul 2022 07:25:28 +1000 Subject: [PATCH 2/2] Added ABGR MASK_MODE --- Tests/images/rgb32bf-abgr.bmp | Bin 0 -> 32650 bytes Tests/test_file_bmp.py | 7 +++++++ src/PIL/BmpImagePlugin.py | 2 ++ 3 files changed, 9 insertions(+) create mode 100644 Tests/images/rgb32bf-abgr.bmp diff --git a/Tests/images/rgb32bf-abgr.bmp b/Tests/images/rgb32bf-abgr.bmp new file mode 100644 index 0000000000000000000000000000000000000000..2443714cadcc65a7576d0b601e10810fd0a95d1b GIT binary patch literal 32650 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 literal 0 HcmV?d00001 diff --git a/Tests/test_file_bmp.py b/Tests/test_file_bmp.py index 776b499e089..d58666b4476 100644 --- a/Tests/test_file_bmp.py +++ b/Tests/test_file_bmp.py @@ -129,6 +129,13 @@ def test_rgba_bitfields(): assert_image_equal_tofile(im, "Tests/images/bmp/q/rgb32bf-xbgr.bmp") + # This test image has been manually hexedited + # to change the bitfield compression in the header from XBGR to ABGR + with Image.open("Tests/images/rgb32bf-abgr.bmp") as im: + assert_image_equal_tofile( + im.convert("RGB"), "Tests/images/bmp/q/rgb32bf-xbgr.bmp" + ) + def test_rle8(): with Image.open("Tests/images/hopper_rle8.bmp") as im: diff --git a/src/PIL/BmpImagePlugin.py b/src/PIL/BmpImagePlugin.py index 5e7c2be1b8b..7bb73fc9388 100644 --- a/src/PIL/BmpImagePlugin.py +++ b/src/PIL/BmpImagePlugin.py @@ -173,6 +173,7 @@ def _bitmap(self, header=0, offset=0): 32: [ (0xFF0000, 0xFF00, 0xFF, 0x0), (0xFF000000, 0xFF0000, 0xFF00, 0x0), + (0xFF000000, 0xFF0000, 0xFF00, 0xFF), (0xFF, 0xFF00, 0xFF0000, 0xFF000000), (0xFF0000, 0xFF00, 0xFF, 0xFF000000), (0x0, 0x0, 0x0, 0x0), @@ -183,6 +184,7 @@ def _bitmap(self, header=0, offset=0): MASK_MODES = { (32, (0xFF0000, 0xFF00, 0xFF, 0x0)): "BGRX", (32, (0xFF000000, 0xFF0000, 0xFF00, 0x0)): "XBGR", + (32, (0xFF000000, 0xFF0000, 0xFF00, 0xFF)): "ABGR", (32, (0xFF, 0xFF00, 0xFF0000, 0xFF000000)): "RGBA", (32, (0xFF0000, 0xFF00, 0xFF, 0xFF000000)): "BGRA", (32, (0x0, 0x0, 0x0, 0x0)): "BGRA",