簡體   English   中英

使用 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)(即,它不是“裁剪”或“過掃描”圖像)。 我們可以考慮寬於長(“風景”)或長於寬(“肖像”)的圖像。

我想你想要類似下面的東西,它使用橫向的目標寬度和縱向的目標高度,並在另一個方向重新計算正確的大小:

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 更強大。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM