首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Python OpenImageIO调整图像大小以保持高宽比

使用Python OpenImageIO调整图像大小以保持高宽比
EN

Stack Overflow用户
提问于 2018-06-18 17:26:01
回答 1查看 1.6K关注 0票数 1

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

目前,这将只是拉伸图像,以适应512x512。

因此,有利于宽度的图像应该基于宽度值来匹配:

然而,赞成高度的图像应该基于高度值来拟合:

代码语言:javascript
复制
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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-19 17:09:18

为了简单起见,让我们假设图像原点是(0,0) (也就是说,它不是“裁剪”或“过度扫描”图像)。我们可以考虑比它们更宽的图像(“景观”),或者比宽(“肖像”)更长的图像。

我认为您需要这样的东西,它使用目标宽度作为景观,目标高度用于肖像,并在另一个方向重新计算适当的大小:

代码语言:javascript
复制
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进行硬编码要健壮一些,就像在原始文件中那样。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50914650

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档