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

时间:2018-06-18 17:26:02

标签: python openimageio

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

目前,这只是拉伸图像以适应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)

1 个答案:

答案 0 :(得分: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时要健壮得多。

相关问题