diff --git a/Tests/images/bgr15.dds b/Tests/images/bgr15.dds new file mode 100644 index 00000000000..63f4bc661da Binary files /dev/null and b/Tests/images/bgr15.dds differ diff --git a/Tests/images/bgr15.png b/Tests/images/bgr15.png new file mode 100644 index 00000000000..a15ab5ad256 Binary files /dev/null and b/Tests/images/bgr15.png differ diff --git a/Tests/test_file_dds.py b/Tests/test_file_dds.py index bb9af7967b7..7772956aff8 100644 --- a/Tests/test_file_dds.py +++ b/Tests/test_file_dds.py @@ -26,6 +26,7 @@ TEST_FILE_UNCOMPRESSED_L = "Tests/images/uncompressed_l.dds" TEST_FILE_UNCOMPRESSED_L_WITH_ALPHA = "Tests/images/uncompressed_la.dds" TEST_FILE_UNCOMPRESSED_RGB = "Tests/images/hopper.dds" +TEST_FILE_UNCOMPRESSED_BGR15 = "Tests/images/bgr15.dds" TEST_FILE_UNCOMPRESSED_RGB_WITH_ALPHA = "Tests/images/uncompressed_rgb.dds" @@ -211,6 +212,7 @@ def test_unimplemented_dxgi_format(): ("L", (128, 128), TEST_FILE_UNCOMPRESSED_L), ("LA", (128, 128), TEST_FILE_UNCOMPRESSED_L_WITH_ALPHA), ("RGB", (128, 128), TEST_FILE_UNCOMPRESSED_RGB), + ("RGB", (128, 128), TEST_FILE_UNCOMPRESSED_BGR15), ("RGBA", (800, 600), TEST_FILE_UNCOMPRESSED_RGB_WITH_ALPHA), ], ) diff --git a/src/PIL/DdsImagePlugin.py b/src/PIL/DdsImagePlugin.py index 54f358c7f9a..54a0ccb3148 100644 --- a/src/PIL/DdsImagePlugin.py +++ b/src/PIL/DdsImagePlugin.py @@ -148,15 +148,17 @@ def _open(self): self.tile = [("raw", (0, 0) + self.size, 0, (self.mode, 0, 1))] elif pfflags & DDPF_RGB: # Texture contains uncompressed RGB data - masks = {mask: ["R", "G", "B", "A"][i] for i, mask in enumerate(masks)} - rawmode = "" - if pfflags & DDPF_ALPHAPIXELS: - rawmode += masks[0xFF000000] - else: + if not pfflags & DDPF_ALPHAPIXELS: self._mode = "RGB" - rawmode += masks[0xFF0000] + masks[0xFF00] + masks[0xFF] + if masks[:3] == (31744, 992, 31) and self.mode == "RGB": + rawmode = "BGR;15" + else: + masks = {mask: ["R", "G", "B", "A"][i] for i, mask in enumerate(masks)} + rawmode = masks[0xFF] + masks[0xFF00] + masks[0xFF0000] + if self.mode == "RGBA": + rawmode += masks[0xFF000000] - self.tile = [("raw", (0, 0) + self.size, 0, (rawmode[::-1], 0, 1))] + self.tile = [("raw", (0, 0) + self.size, 0, (rawmode, 0, 1))] elif pfflags & DDPF_PALETTEINDEXED8: self._mode = "P" self.palette = ImagePalette.raw("RGBA", self.fp.read(1024))