1

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

目前这只会拉伸图像以适应 512x512。

因此,有利于宽度的图像应根据宽度值拟合: 在此处输入图像描述

而偏爱高度的图像应根据高度值拟合: 在此处输入图像描述

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)
4

1 回答 1

1

为简单起见,我们假设图像原点为 (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 时,我使用了原始文件的通道数和数据格式,这比您在原始文件中将其硬编码为 3 chans float 更强大。

于 2018-06-19T17:09:18.430 回答