mirror of
https://github.com/python-pillow/Pillow.git
synced 2024-12-26 01:46:18 +03:00
Merge pull request #4568 from ziplantil/ico-append-images
Add append_images support for ICO
This commit is contained in:
commit
e37a8a263d
|
@ -86,6 +86,20 @@ def test_only_save_relevant_sizes(tmp_path):
|
||||||
assert im_saved.info["sizes"] == {(16, 16), (24, 24), (32, 32), (48, 48)}
|
assert im_saved.info["sizes"] == {(16, 16), (24, 24), (32, 32), (48, 48)}
|
||||||
|
|
||||||
|
|
||||||
|
def test_save_append_images(tmp_path):
|
||||||
|
# append_images should be used for scaled down versions of the image
|
||||||
|
im = hopper("RGBA")
|
||||||
|
provided_im = Image.new("RGBA", (32, 32), (255, 0, 0))
|
||||||
|
outfile = str(tmp_path / "temp_saved_multi_icon.ico")
|
||||||
|
im.save(outfile, sizes=[(32, 32), (128, 128)], append_images=[provided_im])
|
||||||
|
|
||||||
|
with Image.open(outfile) as reread:
|
||||||
|
assert_image_equal(reread, hopper("RGBA"))
|
||||||
|
|
||||||
|
reread.size = (32, 32)
|
||||||
|
assert_image_equal(reread, provided_im)
|
||||||
|
|
||||||
|
|
||||||
def test_unexpected_size():
|
def test_unexpected_size():
|
||||||
# This image has been manually hexedited to state that it is 16x32
|
# This image has been manually hexedited to state that it is 16x32
|
||||||
# while the image within is still 16x16
|
# while the image within is still 16x16
|
||||||
|
|
|
@ -127,8 +127,8 @@ following options are available::
|
||||||
images in the list can be single or multiframe images.
|
images in the list can be single or multiframe images.
|
||||||
This is currently supported for GIF, PDF, PNG, TIFF, and WebP.
|
This is currently supported for GIF, PDF, PNG, TIFF, and WebP.
|
||||||
|
|
||||||
It is also supported for ICNS. If images are passed in of relevant sizes,
|
It is also supported for ICO and ICNS. If images are passed in of relevant
|
||||||
they will be used instead of scaling down the main image.
|
sizes, they will be used instead of scaling down the main image.
|
||||||
|
|
||||||
**include_color_table**
|
**include_color_table**
|
||||||
Whether or not to include local color table.
|
Whether or not to include local color table.
|
||||||
|
@ -238,6 +238,15 @@ The :py:meth:`~PIL.Image.Image.save` method supports the following options:
|
||||||
(64, 64), (128, 128), (256, 256)]``. Any sizes bigger than the original
|
(64, 64), (128, 128), (256, 256)]``. Any sizes bigger than the original
|
||||||
size or 256 will be ignored.
|
size or 256 will be ignored.
|
||||||
|
|
||||||
|
The :py:meth:`~PIL.Image.Image.save` method can take the following keyword arguments:
|
||||||
|
|
||||||
|
**append_images**
|
||||||
|
A list of images to replace the scaled down versions of the image.
|
||||||
|
The order of the images does not matter, as their use is determined by
|
||||||
|
the size of each image.
|
||||||
|
|
||||||
|
.. versionadded:: 8.1.0
|
||||||
|
|
||||||
IM
|
IM
|
||||||
^^
|
^^
|
||||||
|
|
||||||
|
|
|
@ -54,6 +54,7 @@ def _save(im, fp, filename):
|
||||||
sizes = list(sizes)
|
sizes = list(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
|
||||||
|
provided_images = {im.size: im for im in im.encoderinfo.get("append_images", [])}
|
||||||
for size in sizes:
|
for size in sizes:
|
||||||
width, height = size
|
width, height = size
|
||||||
# 0 means 256
|
# 0 means 256
|
||||||
|
@ -65,9 +66,11 @@ def _save(im, fp, filename):
|
||||||
fp.write(struct.pack("<H", 32)) # wBitCount(2)
|
fp.write(struct.pack("<H", 32)) # wBitCount(2)
|
||||||
|
|
||||||
image_io = BytesIO()
|
image_io = BytesIO()
|
||||||
# TODO: invent a more convenient method for proportional scalings
|
tmp = provided_images.get(size)
|
||||||
tmp = im.copy()
|
if not tmp:
|
||||||
tmp.thumbnail(size, Image.LANCZOS, reducing_gap=None)
|
# TODO: invent a more convenient method for proportional scalings
|
||||||
|
tmp = im.copy()
|
||||||
|
tmp.thumbnail(size, Image.LANCZOS, reducing_gap=None)
|
||||||
tmp.save(image_io, "png")
|
tmp.save(image_io, "png")
|
||||||
image_io.seek(0)
|
image_io.seek(0)
|
||||||
image_bytes = image_io.read()
|
image_bytes = image_io.read()
|
||||||
|
|
Loading…
Reference in New Issue
Block a user