使用Python OpenImageIO维护纵横比调整图像大小

2024-09-28 23:40:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试在使用OpenImageIO和python进行一些额外的处理后调整图像的大小。然而,这个过程似乎不像PIL那么简单。在PIL中,我可以提供一个新的分辨率,例如512 x 512,它将调整我的图像大小,而不管它是当前的像素方面,并调整它的大小,以适应它的最大长度,使它适合在一个512x512的框内。如何使用OpenImageIO来完成此操作?在

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

Tags: 图像data宽度pil高度过程分辨率像素
1条回答
网友
1楼 · 发布于 2024-09-28 23:40:51

为了简单起见,我们假设图像原点是(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要好一些。在

相关问题 更多 >