【问题标题】:Resize image using Python OpenImageIO maintain aspect ratio使用 Python OpenImageIO 调整图像大小保持纵横比
【发布时间】:2018-06-20 21:29:31
【问题描述】:

在使用 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)

【问题讨论】:

    标签: python openimageio


    【解决方案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 更可靠。

    【讨论】:

      猜你喜欢
      • 2013-06-26
      • 2012-04-15
      • 2012-05-01
      • 2012-11-15
      • 1970-01-01
      相关资源
      最近更新 更多