From e84e02997c6c54dd550e75061a7ee4cd5b6b53b9 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Wed, 6 Apr 2016 06:22:12 -0700 Subject: [PATCH 1/2] Fixes DIB image format The DIB image format uses the 40 byte BMP header, followed by 3 masks for RGB channels. We were reading 4 masks, consuming the first pixel of the image. Mostly fixes issue #1293. Remaining issue: alpha channel is actually a transparency mask. --- PIL/BmpImagePlugin.py | 6 +++++- Tests/images/clipboard.dib | Bin 0 -> 208436 bytes Tests/images/clipboard_target.png | Bin 0 -> 9493 bytes Tests/test_file_bmp.py | 7 +++++++ 4 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 Tests/images/clipboard.dib create mode 100644 Tests/images/clipboard_target.png diff --git a/PIL/BmpImagePlugin.py b/PIL/BmpImagePlugin.py index e398445fa..950ee13a1 100644 --- a/PIL/BmpImagePlugin.py +++ b/PIL/BmpImagePlugin.py @@ -109,7 +109,11 @@ class BmpImageFile(ImageFile.ImageFile): for idx, mask in enumerate(['r_mask', 'g_mask', 'b_mask', 'a_mask']): file_info[mask] = i32(header_data[36+idx*4:40+idx*4]) else: - for mask in ['r_mask', 'g_mask', 'b_mask', 'a_mask']: + # 40 byte headers only have the three components in the bitfields masks, + # ref: https://msdn.microsoft.com/en-us/library/windows/desktop/dd183376(v=vs.85).aspx + # See also https://github.com/python-pillow/Pillow/issues/1293 + file_info['a_mask'] = 0xff000000 + for mask in ['r_mask', 'g_mask', 'b_mask']: file_info[mask] = i32(read(4)) file_info['rgb_mask'] = (file_info['r_mask'], file_info['g_mask'], file_info['b_mask']) file_info['rgba_mask'] = (file_info['r_mask'], file_info['g_mask'], file_info['b_mask'], file_info['a_mask']) diff --git a/Tests/images/clipboard.dib b/Tests/images/clipboard.dib new file mode 100644 index 0000000000000000000000000000000000000000..03dcab81d0d3c0b53227930815216ddbc4d22223 GIT binary patch literal 208436 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 literal 0 HcmV?d00001 diff --git a/Tests/images/clipboard_target.png b/Tests/images/clipboard_target.png new file mode 100644 index 0000000000000000000000000000000000000000..46a69654340344332751d73e276bfc83dcbe95af GIT binary patch literal 9493 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 snR%T;3;!R0jh(TDsmFf;SU9- Date: Wed, 6 Apr 2016 07:38:24 -0700 Subject: [PATCH 2/2] Added Transparency mask unpacker for BMP files --- PIL/BmpImagePlugin.py | 17 ++++++++++++++--- libImaging/Unpack.c | 16 ++++++++++++++++ 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/PIL/BmpImagePlugin.py b/PIL/BmpImagePlugin.py index 950ee13a1..94764855d 100644 --- a/PIL/BmpImagePlugin.py +++ b/PIL/BmpImagePlugin.py @@ -112,7 +112,8 @@ class BmpImageFile(ImageFile.ImageFile): # 40 byte headers only have the three components in the bitfields masks, # ref: https://msdn.microsoft.com/en-us/library/windows/desktop/dd183376(v=vs.85).aspx # See also https://github.com/python-pillow/Pillow/issues/1293 - file_info['a_mask'] = 0xff000000 + # Note below, None is a key in the SUPPORTED and MASK_MODES structures. + file_info['a_mask'] = None for mask in ['r_mask', 'g_mask', 'b_mask']: file_info[mask] = i32(read(4)) file_info['rgb_mask'] = (file_info['r_mask'], file_info['g_mask'], file_info['b_mask']) @@ -134,12 +135,22 @@ class BmpImageFile(ImageFile.ImageFile): # ----------------- Process BMP with Bitfields compression (not palette) if file_info['compression'] == self.BITFIELDS: SUPPORTED = { - 32: [(0xff0000, 0xff00, 0xff, 0x0), (0xff0000, 0xff00, 0xff, 0xff000000), (0x0, 0x0, 0x0, 0x0)], + 32: [(0xff0000, 0xff00, 0xff, 0x0), + (0xff0000, 0xff00, 0xff, None), + (0xff0000, 0xff00, 0xff, 0xff000000), + (0x0, 0x0, 0x0, 0x0)], 24: [(0xff0000, 0xff00, 0xff)], 16: [(0xf800, 0x7e0, 0x1f), (0x7c00, 0x3e0, 0x1f)] } + # From inspecting DIB files from Vista screenshots, the + # file format is a 32 bit color image, where the 'Alpha' + # channel for screenshots is actually a transparency mask + # (255-alpha) where 00 is solid and ff is transparent. I + # can't find documentation of this, but it matches + # imagemagick's conversion of the .dib file into a .png. MASK_MODES = { (32, (0xff0000, 0xff00, 0xff, 0x0)): "BGRX", + (32, (0xff0000, 0xff00, 0xff, None)): "BGRT", (32, (0xff0000, 0xff00, 0xff, 0xff000000)): "BGRA", (32, (0x0, 0x0, 0x0, 0x0)): "BGRA", (24, (0xff0000, 0xff00, 0xff)): "BGR", @@ -149,7 +160,7 @@ class BmpImageFile(ImageFile.ImageFile): if file_info['bits'] in SUPPORTED: if file_info['bits'] == 32 and file_info['rgba_mask'] in SUPPORTED[file_info['bits']]: raw_mode = MASK_MODES[(file_info['bits'], file_info['rgba_mask'])] - self.mode = "RGBA" if raw_mode in ("BGRA",) else self.mode + self.mode = "RGBA" if raw_mode in ("BGRA", "BGRT") else self.mode elif file_info['bits'] in (24, 16) and file_info['rgb_mask'] in SUPPORTED[file_info['bits']]: raw_mode = MASK_MODES[(file_info['bits'], file_info['rgb_mask'])] else: diff --git a/libImaging/Unpack.c b/libImaging/Unpack.c index 3fab73cec..9b3e666e8 100644 --- a/libImaging/Unpack.c +++ b/libImaging/Unpack.c @@ -738,6 +738,21 @@ unpackBGRA(UINT8* out, const UINT8* in, int pixels) } } +static void +unpackBGRT(UINT8* out, const UINT8* in, int pixels) +{ + int i; + /* RGBA, reversed bytes */ + /* Transparency map, rather than an alpha channel */ + for (i = 0; i < pixels; i++) { + out[R] = in[2]; + out[G] = in[1]; + out[B] = in[0]; + out[A] = 255 - in[3]; + out += 4; in += 4; + } +} + /* Unpack to "CMYK" image */ @@ -1111,6 +1126,7 @@ static struct { {"RGBA", "RGBA;4B", 16, ImagingUnpackRGBA4B}, {"RGBA", "RGBA;16B", 64, unpackRGBA16B}, {"RGBA", "BGRA", 32, unpackBGRA}, + {"RGBA", "BGRT", 32, unpackBGRT}, {"RGBA", "ARGB", 32, unpackARGB}, {"RGBA", "ABGR", 32, unpackABGR}, {"RGBA", "YCCA;P", 32, ImagingUnpackYCCA},