mirror of
https://github.com/python-pillow/Pillow.git
synced 2024-12-24 17:06:16 +03:00
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.
This commit is contained in:
parent
faeb269e30
commit
23a847c532
|
@ -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'])
|
||||
|
|
BIN
Tests/images/clipboard.dib
Normal file
BIN
Tests/images/clipboard.dib
Normal file
Binary file not shown.
BIN
Tests/images/clipboard_target.png
Normal file
BIN
Tests/images/clipboard_target.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 9.3 KiB |
|
@ -70,6 +70,13 @@ class TestFileBmp(PillowTestCase):
|
|||
self.assertEqual(im.size, reloaded.size)
|
||||
self.assertEqual(reloaded.format, "JPEG")
|
||||
|
||||
def test_load_dib(self):
|
||||
# test for #1293, Imagegrab returning Unsupported Bitfields Format
|
||||
im = BmpImagePlugin.DibImageFile('Tests/images/clipboard.dib')
|
||||
target = Image.open('Tests/images/clipboard_target.png')
|
||||
self.assert_image_equal(im.convert('RGB'), target.convert('RGB'))
|
||||
self.assert_image_similar(im, target, 1)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
|
Loading…
Reference in New Issue
Block a user