gpt4 book ai didi

python - 使用 Python OpenImageIO 调整图像大小并保持纵横比

转载 作者:行者123 更新时间:2023-12-01 09:19:29 25 4
gpt4 key购买 nike

我正在尝试使用 OpenImageIO 和 python 进行一些额外处理后调整图像大小。然而这个过程似乎并不像PIL那么容易。在 PIL 中,我可以提供一个新的分辨率,例如 512 x 512,它会调整我的图像大小,无论其当前像素方面如何,并调整其大小以适应其最大长度,以便它适合在 512x512 盒子内。我如何使用 OpenImageIO 来做到这一点?

目前,这只会拉伸(stretch)图像以适合 512x512。

因此,喜欢宽度的图像应该根据宽度值进行调整: enter image description here

而有利于高度的图像应根据高度值进行调整: enter image description here

buf = oiio.ImageBuf(file)
data = buf.spec()
print data.width
print data.height
resized = oiio.ImageBuf(oiio.ImageSpec (512, 512, 3, oiio.FLOAT))
oiio.ImageBufAlgo.resize(resized, buf, roi=oiio.ROI.All, nthreads=4)
resized.write(output)

最佳答案

为简单起见,我们假设图像原点为 (0,0)(即,它不是“裁剪”或“过扫描”图像)。我们可以考虑宽度大于长度的图像(“横向”),或长度大于宽度的图像(“肖像”)。

我认为您想要如下所示的内容,它使用横向的目标宽度和纵向的目标高度,并重新计算另一个方向的正确尺寸:

goal_width = ...
goal_height = ...

buf = oiio.ImageBuf(file)
spec = buf.spec()
w = spec.width
h = spec.height
aspect = float(w) / float(h)
if aspect >= 1.0 :
# source image is landscape (or square)
goal_height = int(h * goal_height / w)
else :
# source image is portrait
goal_width = (w * goal_width / h)

resized = oiio.ImageBuf(oiio.ImageSpec (goal_width, goal_height, spec.nchannels, spec.format))
oiio.ImageBufAlgo.resize(resized, buf)
resized.write(output)

这不是我的想法,你应该测试它并调整我是否犯了错误。但这就是要点。

旁白:请注意,当我创建调整大小的 buf 时,我使用了原始文件的 channel 数和数据格式,这比像在原始文件中那样将其硬编码为 3 channel 浮点更稳健。

关于python - 使用 Python OpenImageIO 调整图像大小并保持纵横比,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50914650/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com