我假设,您在打开生成的 ICO 文件时遇到问题,因为您使用的软件在打开 ICO 文件时只需要特定大小的方形图像!?不幸的是,imageio.imwrite 在输入非方形图像时,似乎只将较大的尺寸设置为默认的 16、24、... 像素来保存 ICO 文件。假设,我们有这样一张图片:
而且,我们有一些像这样的测试代码:
import imageio
# Read image
img_io = imageio.imread('image.png')
# Write ICO image
imageio.imwrite('image.ico', img_io)
生成的image.ico 有六个尺寸为16 x 13、24 x 19 等的图像。
如果你想解决这个问题,你应该事先适当地调整你的图像大小以获得一个方形图像。实际上,使用imageio 时调整图像大小可能非常困难。有关详细信息,请参阅this recent Q&A。如果您只是想在不保持纵横比的情况下获得方形图像,您可能需要使用skimage.transform.resize:
import imageio
from skimage.transform import resize
# Read image
img_io = imageio.imread('image.png')
# Resize image
img_io = resize(img_io, (200, 200))
# Write ICO image
imageio.imwrite('image.ico', img_io)
现在,生成的image.ico 有六张图像,尺寸为16 x 16、24 x 24,依此类推。
如果您想保持图片的纵横比,则需要为图片添加适当的边框。在那个问题上有this helpful Q&A。您还可以仅使用 NumPy 添加精美的透明边框:
import imageio
import numpy as np
# Read image
img_io = imageio.imread('image.png')
# Add transparent borders to image
h, w = img_io.shape[:2]
img = np.zeros((w, w, 4), np.uint8)
img[30:h+30, :, :3] = img_io
img[30:h+30, :, 3] = 255
# Write ICO image
imageio.imwrite('image.ico', img)
现在,生成的image.ico 甚至有七个尺寸为16 x 16、...、256 x 256 的图像,因为修改后的图像已经足够大了。
----------------------------------------
System information
----------------------------------------
Platform: Windows-10-10.0.16299-SP0
Python: 3.8.5
imageio: 2.9.0
NumPy: 1.19.5
scikit-image: 0.18.1
----------------------------------------