2013-01-23 57 views
0

我知道我可以用一堆嵌套的if語句來做到這一點,但我不禁感覺有更優雅的方式。這真的只是一個數學問題,但我對pythonic的答案感興趣,如果確實存在的話。通過給定最小尺寸的單個維度(x OR y)縮放圖像

我有一個圖像可以是任何尺寸/寬高比。

它必須或向下,使得其覆蓋55瓦特X 168H的minumum按比例放大

這裏的複雜之處在於,它需要通過只需要一個單一的值指定的長度的函數被縮放一個廣場的一面,它將適合其內部的圖像。例如,假設我們有一個尺寸爲1000w x 500h的圖像,並且我們將它縮放到200,那麼生成的圖像必須適合200邊的正方形,這意味着生成的圖像將是200w x 100h。

反過來說,如果我們的圖像是200x1000,我們可以擴展到200,我們最終將得到40x200。

因此,要將1000x500的圖像縮放到55x168,我們需要將它縮放到336,因爲這是可以放入336x336正方形內的最大圖像,因此尺寸爲336x168。

爲了將200x1000的圖像縮放到55x168,我們需要將它縮放到275並最終以55x275。

希望這比泥更清晰!感謝您的任何想法。

證明:對於那些對我爲什麼通過方形值進行縮放比例感興趣的用戶,這是Picasa通過URL注入縮放圖片的方式。例如採取以下2個網址:

通知都具有URL組件s150,然而一個圖像是150x112且另一個爲112x150。 150是這些圖像都適合的正方形的值。

回答

1
def name_of_function(img_x, img_y): # for lack of a better name 
    image_dimensions = (img_x, img_y) 
    min_dimensions = (55.0, 168.0) 
    scale = min(image_dimensions[i]/min_dimensions[i] for i in range(2)) 
    return max(i/scale for i in image_dimensions) 

name_of_function(1000, 500) 
# 336.0 
name_of_function(200, 1000) 
# 275.0 

很確定這是你要找的。

+0

精湛,謝謝! – DanH

1

我認爲您可能需要詳細說明詳情,但我會假定該函數可以訪問圖像或其尺寸,否則計算是不可能的。

但是,在另一方面,這樣的事情應該工作:

def percent_to_scale_to(image, box_side_px): 
    img_width, img_height = Image(image).size() # or however you get w/h 
    greater_img_dimension = max(img_width, img_height) 
    scale_percent = (float(box_side_px)/float(greater_img_dimension)) * 100.0 

你可能會需要查看一些來電的簽名,也不要指望它只是一個工作剪切和粘貼,但作爲僞代碼,它可能會給你一個方法的想法。 :)

你會想看看整數除法,這可能會產生意想不到的行爲。這就是爲什麼轉換在分割之前浮動的原因;否則結果在小數點處被截斷,大部分時間可能會返回零值。如果你還不熟悉,那麼對Python的分割行爲進行一些快速研究可能是值得的。

+0

對不起,你說得對,我也許應該更好一點解釋了我的投入,但對方的回答已經釘它:) – DanH