2011-02-22 180 views
5

我目前使用Blobstore爲圖像生成縮略圖,但是,我喜歡將縮略圖的尺寸存儲在img標記中,因爲這是很好的做法,有助於加快渲染速度,並使部分加載的頁面看起來更漂亮一些。App Engine:計算從Blobstore服務縮略圖生成縮略圖的尺寸

我該如何計算由blobstore生成的縮略圖的尺寸,只知道原始圖像的尺寸?

我以前的嘗試並不十分準確,大部分時間都是一兩個像素(可能是由於四捨五入)。

據我所知,獲取縮略圖並比使用圖像API檢查尺寸是可行的,但我認爲效率不高。

這裏是我用來計算它的代碼,但是,它偶爾會偏離一個像素,導致瀏覽器略微拉伸圖像,從而導致調整大小的人工製品以及性能較差。

from __future__ import division 
def resized_size(original_width, original_height, width, height): 
    original_ratio = float(original_width)/float(original_height) 
    resize_ratio = float(width)/float(height) 
    if original_ratio >= resize_ratio: 
     return int(width), int(round(float(width)/float(original_ratio))) 
    else: 
     return int(round(float(original_ratio) * float(height))), int(height) 

準確性非常重要!

+1

好問題!你嘗試了什麼公式?在什麼情況下錯了? –

+0

@systempuntoout,我沒有生成它們,Google的圖片服務API是,它不提供維度。 @Nick Johnson,我用我目前使用的代碼更新了我的問題。 –

回答

4

我看到了問題。原因是C的rint被用來計算 的尺寸。 Python沒有一個相當於RINT實現 因爲它是在1.6取出由Rossum的:

http://markmail.org/message/4di24iqm7zhc4rwc

你只有靠現在的問題是要在Python中實現自己的RINT。

默認情況下,rint默認會執行「round to even」,而python會執行其他操作。 下面是一個簡單的實現(沒有邊緣的情況下的處理爲+ INF -INF等)

import math 

def rint(x): 
    x_int = int(x) 
    x_rem = x - x_int # this is problematic 
    if (x_int % 2) == 1: 
    return round(x) 
    else: 
    if x_rem <= 0.5: 
     return math.floor(x) 
    else: 
     return math.ceil(x) 

上面的代碼是如何它應該在理論上可以實現的。問題在於 x_rem。 x - x_int應該得到小數部分組織,但是您可以得到 部分+增量。所以你可以嘗試添加閾值如果你想

import math 

def rint(x): 
    x_int = int(x) 
    x_rem = x - x_int 
    if (x_int % 2) == 1: 
    return round(x) 
    else: 
    if x_rem - 0.5 < 0.001: 
     return math.floor(x) 
    else: 
     return math.ceil(x) 

在這裏。我硬編碼0.001門檻。閾值本身是有問題的。 我想你真的需要玩弄rint的實現,並將其適用於你的應用程序,並看看什麼效果最好。祝你好運!

+0

我不熟悉rint,我將如何在Python中實現它? –

0

假設你有一個1600x1200的原始圖像,你想得到一個尺寸800的縮略圖, 預期的結果是一個800x600的圖像。要計算這一點,您可以執行以下操作:

// In Java 
double aspectRatio = originalWidth/originalHeight; 
output_width = 800; 
output_height = (int)Math.round(800.0/aspectRatio); 

讓我們來看看這是否適用於退化情況。假設你有一個原始的 145x111,你想得到一個大小32縮略圖。

aspectRatio == 1.3063063063063063 
output_width == 32 
output_height == Math.round(32.0/1.3063063063063063) == 24 

您可以對縱向圖像做類似的事情。