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

标签 python openimageio

我正在尝试使用 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/

相关文章:

python - 沙盒 python 插件

python - dataframe如何通过窗口函数获得相同的groupby

python - Keras:在新实验中重复使用经过训练的权重

python - Django 查询未知数量的多个日期范围

python - 在 HTML 中显示一个 python 文件,保留空格等

python - 尝试使用 python 和 openimageIO 提取子图像失败