使用 Python 调整图像大小 OpenImageIO 保持纵横比
Resize image using Python OpenImageIO maintain aspect ratio
在使用 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)
为简单起见,我们假设图像原点为 (0,0)(即,它不是 "crop" 或 "overscan" 图像)。我们可以考虑宽度大于长度 ("landscape") 或长度大于宽度 ("portrait") 的图像。
我想你想要类似下面的东西,它使用横向的目标宽度和纵向的目标高度,并在另一个方向重新计算适当的尺寸:
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 时,我使用了原始文件的通道数和数据格式,这比您在原创.
在使用 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)
为简单起见,我们假设图像原点为 (0,0)(即,它不是 "crop" 或 "overscan" 图像)。我们可以考虑宽度大于长度 ("landscape") 或长度大于宽度 ("portrait") 的图像。
我想你想要类似下面的东西,它使用横向的目标宽度和纵向的目标高度,并在另一个方向重新计算适当的尺寸:
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 时,我使用了原始文件的通道数和数据格式,这比您在原创.