首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用imageio调整图像大小以获得合适的ICO文件?

如何使用imageio调整图像大小以获得合适的ICO文件?
EN

Stack Overflow用户
提问于 2021-01-16 13:23:34
回答 2查看 579关注 0票数 4

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

这是我的代码:

代码语言:javascript
运行
复制
import imageio
image = imageio.imread('image.png')
imageio.imwrite("image.ico", image)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-01-24 05:46:46

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

并且,我们有一些测试代码,如下所示:

代码语言:javascript
运行
复制
import imageio

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

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

生成的image.ico有6个维度为16 x 1324 x 19等的图像。

如果你想解决这个问题,你应该事先适当地调整图像的大小,以获得正方形的图像。实际上,在使用imageio时,调整图像的大小可能非常困难。有关详细信息,请参阅this recent Q&A。如果您只是想要一个正方形图像,而不想保持纵横比,那么您可能需要使用skimage.transform.resize

代码语言:javascript
运行
复制
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有6个维度为16 x 1624 x 24等的图像。

如果你想保持图像的纵横比,你需要给你的图像添加适当的边框。在这个问题上有this helpful Q&A。您还可以单独使用NumPy添加别致的透明边框:

代码语言:javascript
运行
复制
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的图像,因为修改后的图像足够大。

代码语言:javascript
运行
复制
----------------------------------------
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
----------------------------------------
票数 2
EN

Stack Overflow用户

发布于 2021-01-16 21:56:27

您可以使用reshape(),这样您的代码就可以像这样

代码语言:javascript
运行
复制
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的例子

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65746734

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档