mirror of
https://github.com/python-pillow/Pillow.git
synced 2025-02-10 08:30:49 +03:00
Merge pull request #2265 from hugovk/256x256-ico
Allow saving .ico files of 256x256 instead of 255x255
This commit is contained in:
commit
617c850337
|
@ -44,16 +44,17 @@ def _save(im, fp, filename):
|
||||||
fp.write(_MAGIC) # (2+2)
|
fp.write(_MAGIC) # (2+2)
|
||||||
sizes = im.encoderinfo.get("sizes",
|
sizes = im.encoderinfo.get("sizes",
|
||||||
[(16, 16), (24, 24), (32, 32), (48, 48),
|
[(16, 16), (24, 24), (32, 32), (48, 48),
|
||||||
(64, 64), (128, 128), (255, 255)])
|
(64, 64), (128, 128), (256, 256)])
|
||||||
width, height = im.size
|
width, height = im.size
|
||||||
filter(lambda x: False if (x[0] > width or x[1] > height or
|
filter(lambda x: False if (x[0] > width or x[1] > height or
|
||||||
x[0] > 255 or x[1] > 255) else True, sizes)
|
x[0] > 256 or x[1] > 256) else True, sizes)
|
||||||
fp.write(struct.pack("<H", len(sizes))) # idCount(2)
|
fp.write(struct.pack("<H", len(sizes))) # idCount(2)
|
||||||
offset = fp.tell() + len(sizes)*16
|
offset = fp.tell() + len(sizes)*16
|
||||||
for size in sizes:
|
for size in sizes:
|
||||||
width, height = size
|
width, height = size
|
||||||
fp.write(struct.pack("B", width)) # bWidth(1)
|
# 0 means 256
|
||||||
fp.write(struct.pack("B", height)) # bHeight(1)
|
fp.write(struct.pack("B", width if width < 256 else 0)) # bWidth(1)
|
||||||
|
fp.write(struct.pack("B", height if height < 256 else 0)) # bHeight(1)
|
||||||
fp.write(b"\0") # bColorCount(1)
|
fp.write(b"\0") # bColorCount(1)
|
||||||
fp.write(b"\0") # bReserved(1)
|
fp.write(b"\0") # bReserved(1)
|
||||||
fp.write(b"\0\0") # wPlanes(2)
|
fp.write(b"\0\0") # wPlanes(2)
|
||||||
|
@ -215,13 +216,13 @@ class IcoFile(object):
|
||||||
total_bytes = int((w * im.size[1]) / 8)
|
total_bytes = int((w * im.size[1]) / 8)
|
||||||
|
|
||||||
self.buf.seek(and_mask_offset)
|
self.buf.seek(and_mask_offset)
|
||||||
maskData = self.buf.read(total_bytes)
|
mask_data = self.buf.read(total_bytes)
|
||||||
|
|
||||||
# convert raw data to image
|
# convert raw data to image
|
||||||
mask = Image.frombuffer(
|
mask = Image.frombuffer(
|
||||||
'1', # 1 bpp
|
'1', # 1 bpp
|
||||||
im.size, # (w, h)
|
im.size, # (w, h)
|
||||||
maskData, # source chars
|
mask_data, # source chars
|
||||||
'raw', # raw decoder
|
'raw', # raw decoder
|
||||||
('1;I', int(w/8), -1) # 1bpp inverted, padded, reversed
|
('1;I', int(w/8), -1) # 1bpp inverted, padded, reversed
|
||||||
)
|
)
|
||||||
|
@ -278,6 +279,7 @@ class IcoImageFile(ImageFile.ImageFile):
|
||||||
#
|
#
|
||||||
# --------------------------------------------------------------------
|
# --------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
Image.register_open(IcoImageFile.format, IcoImageFile, _accept)
|
Image.register_open(IcoImageFile.format, IcoImageFile, _accept)
|
||||||
Image.register_save(IcoImageFile.format, _save)
|
Image.register_save(IcoImageFile.format, _save)
|
||||||
Image.register_extension(IcoImageFile.format, ".ico")
|
Image.register_extension(IcoImageFile.format, ".ico")
|
||||||
|
|
BIN
Tests/images/hopper_256x256.ico
Normal file
BIN
Tests/images/hopper_256x256.ico
Normal file
Binary file not shown.
After Width: | Height: | Size: 200 KiB |
|
@ -48,6 +48,19 @@ class TestFileIco(PillowTestCase):
|
||||||
self.assert_image_equal(reloaded,
|
self.assert_image_equal(reloaded,
|
||||||
hopper().resize((32, 32), Image.LANCZOS))
|
hopper().resize((32, 32), Image.LANCZOS))
|
||||||
|
|
||||||
|
def test_save_256x256(self):
|
||||||
|
"""Issue #2264 https://github.com/python-pillow/Pillow/issues/2264"""
|
||||||
|
# Arrange
|
||||||
|
im = Image.open("Tests/images/hopper_256x256.ico")
|
||||||
|
outfile = self.tempfile("temp_saved_hopper_256x256.ico")
|
||||||
|
|
||||||
|
# Act
|
||||||
|
im.save(outfile)
|
||||||
|
im_saved = Image.open(outfile)
|
||||||
|
|
||||||
|
# Assert
|
||||||
|
self.assertEqual(im_saved.size, (256, 256))
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
unittest.main()
|
unittest.main()
|
||||||
|
|
Loading…
Reference in New Issue
Block a user