问题描述
我想从图像中保存 ICO 文件。 imageio
运行良好,但对于水平图像,它给了我一个错误。
这是我的代码:
import imageio
image = imageio.imread('image.png')
imageio.imwrite("image.ico",image)
解决方法
您可以使用 reshape()
使您的代码变得像
import imageio
image = imageio.imread('image.png')
M,N,C = image.shape
image = image.reshape((N,M,C)) # new shape here,I inverted M and N
imageio.imwrite("image.ico",image)
但是注意,像素数不能随reshape
而变化,也就是总数,在这种情况下,是M * N
,一旦你重塑,新的像素数必须是相同的。
如果要改,可以用slicing
,有例子in the documentation
我假设您在打开生成的 ICO 文件时遇到问题,因为您使用的软件在打开 ICO 文件时只需要特定大小的方形图像!?不幸的是,似乎 imageio.imwrite
保存 ICO 文件时仅将较大的尺寸设置为默认 16、24、... 像素,当提供非方形图像时。假设,我们有这样一个图像:
而且,我们有一些这样的测试代码:
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
----------------------------------------