diff --git a/Tests/images/palette.dds b/Tests/images/palette.dds new file mode 100644 index 000000000..7171cb1f2 Binary files /dev/null and b/Tests/images/palette.dds differ diff --git a/Tests/test_file_dds.py b/Tests/test_file_dds.py index ae4831d48..bb9af7967 100644 --- a/Tests/test_file_dds.py +++ b/Tests/test_file_dds.py @@ -298,6 +298,11 @@ def test_dxt5_colorblock_alpha_issue_4142(): assert px[2] != 0 +def test_palette(): + with Image.open("Tests/images/palette.dds") as im: + assert_image_equal_tofile(im, "Tests/images/transparent.gif") + + def test_unimplemented_pixel_format(): with pytest.raises(NotImplementedError): with Image.open("Tests/images/unimplemented_pixel_format.dds"): diff --git a/src/PIL/DdsImagePlugin.py b/src/PIL/DdsImagePlugin.py index 4da33332e..54f358c7f 100644 --- a/src/PIL/DdsImagePlugin.py +++ b/src/PIL/DdsImagePlugin.py @@ -13,7 +13,7 @@ Full text of the CC0 license: import struct from io import BytesIO -from . import Image, ImageFile +from . import Image, ImageFile, ImagePalette from ._binary import o32le as o32 # Magic ("DDS ") @@ -157,6 +157,10 @@ class DdsImageFile(ImageFile.ImageFile): rawmode += masks[0xFF0000] + masks[0xFF00] + masks[0xFF] self.tile = [("raw", (0, 0) + self.size, 0, (rawmode[::-1], 0, 1))] + elif pfflags & DDPF_PALETTEINDEXED8: + self._mode = "P" + self.palette = ImagePalette.raw("RGBA", self.fp.read(1024)) + self.tile = [("raw", (0, 0) + self.size, 0, "L")] else: data_start = header_size + 4 n = 0