微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

我想从图像中保存 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、... 像素,当提供非方形图像时。假设,我们有这样一个图像:

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 了解详情。如果您只是想在不保持纵横比的情况下获得方形图像,则可能需要使用 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 1624 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
----------------------------------------

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。