如何使用imageio调整图像大小以获得正确的ICO文件?

2024-05-14 03:39:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我想保存图像中的ICO文件imageio工作正常,但对于水平图像,它给了我一个错误

这是我的代码:

import imageio
image = imageio.imread('image.png')
imageio.imwrite("image.ico", image)

Tags: 文件代码图像imageimportpng错误水平
2条回答

我假设,您在打开生成的ICO文件时遇到问题,因为您使用的软件在打开ICO文件时只需要特定大小的方形图像!?不幸的是,似乎^{}保存ICO文件时只将较大的维度设置为默认的16、24、。。。像素,当馈送非方形图像时。假设我们有这样一个形象:

Input

我们有一些测试代码如下:

import imageio

# Read image
img_io = imageio.imread('image.png')

# Write ICO image
imageio.imwrite('image.ico', img_io)

结果image.ico有六个维度为16 x 1324 x 19的图像,依此类推

如果你想解决这个问题,你应该事先适当调整你的图像大小,以得到一个正方形的图像。实际上,当使用imageio时,调整图像大小可能非常困难。有关详细信息,请参见this recent Q&A。如果您只是想在不保持纵横比的情况下获得方形图像,则可能需要使用^{}

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 1624 x 24的图像,依此类推

如果要保持图像的纵横比,需要为图像添加适当的边框。在那个问题上有分歧。您还可以仅使用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 16256 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
                    

您可以使用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

相关问题 更多 >