<p>我假设,您在打开生成的ICO文件时遇到问题,因为您使用的软件在打开ICO文件时只需要特定大小的方形图像!?不幸的是,似乎<a href="https://imageio.readthedocs.io/en/stable/userapi.html#imageio.imwrite" rel="nofollow noreferrer">^{<cd1>}</a>保存ICO文件时只将较大的维度设置为默认的16、24、。。。像素,当馈送非方形图像时。假设我们有这样一个形象:</p>
<p><a href="https://i.stack.imgur.com/ZlXrC.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/ZlXrC.png" alt="Input"/></a></p>
<p>我们有一些测试代码如下:</p>
<pre class="lang-py prettyprint-override"><code>import imageio
# Read image
img_io = imageio.imread('image.png')
# Write ICO image
imageio.imwrite('image.ico', img_io)
</code></pre>
<p>结果<code>image.ico</code>有六个维度为<code>16 x 13</code>、<code>24 x 19</code>的图像,依此类推</p>
<p>如果你想解决这个问题,你应该事先适当调整你的图像大小,以得到一个正方形的图像。实际上,当使用<code>imageio</code>时,调整图像大小可能非常困难。有关详细信息,请参见<a href="https://stackoverflow.com/q/65733362/11089932">this recent Q&A</a>。如果您只是想在不保持纵横比的情况下获得方形图像,则可能需要使用<a href="https://scikit-image.org/docs/dev/api/skimage.transform.html#skimage.transform.resize" rel="nofollow noreferrer">^{<cd6>}</a>:</p>
<pre class="lang-py prettyprint-override"><code>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)
</code></pre>
<p>现在,得到的<code>image.ico</code>有六个维度为<code>16 x 16</code>、<code>24 x 24</code>的图像,依此类推</p>
<p>如果要保持图像的纵横比,需要为图像添加适当的边框。在那个问题上有分歧。您还可以仅使用NumPy添加奇特的透明边框:</p>
<pre class="lang-py prettyprint-override"><code>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)
</code></pre>
<p>现在,结果<code>image.ico</code>甚至有七个维度为<code>16 x 16</code>,<code>256 x 256</code>的图像,因为修改后的图像足够大</p>
<pre class="lang-none prettyprint-override"><code>
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
</code></pre>