代码之家  ›  专栏  ›  技术社区  ›  JokerMartini

使用python openimageio调整图像大小保持纵横比

  •  1
  • JokerMartini  · 技术社区  · 6 年前

    我正在尝试使用OpenIMAIIO和Python做一些额外的处理来调整图像的大小。然而,这个过程似乎不像PIL那么容易。在PIL中,我可以提供一个新的解决方案,例如512×512,它将调整我的图像,无论它是当前像素方面,并调整它以适应它的最大长度,所以它适合在一个512X512框内。如何使用openimageio完成此操作?

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

    因此,支持宽度的图像应该根据宽度值进行调整: 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 回复  |  直到 6 年前
        1
  •  1
  •   JokerMartini    6 年前

    为了简单起见,假设图像原点是(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个浮动一样。

    推荐文章