2012-12-10 28 views
1

使用Python圖片庫PIL和谷歌App Engine的Blob存儲...Python的谷歌應用程序引擎Image對象

此:

img = images.Image(blob_key=image) 
logging.info(img.size) 
self.response.headers['Content-Type'] = 'image/jpeg' 
self.response.out.write(img) 

有屬性錯誤:

AttributeError: 'Image' object has no attribute 'size' 

所以Image實例從谷歌應用程序引擎沒有大小?

那麼接下來是如何工作的:

img = images.Image(blob_key=image) 
img.resize(width, height) 
img.im_feeling_lucky() 
thumbnail = img.execute_transforms(output_encoding=images.JPEG) 
self.response.headers['Content-Type'] = 'image/jpeg' 
self.response.out.write(thumbnail) 

我缺少什麼?

編輯:

的修復是使用get_serving_url 和建議@voscausa不能使用我的形象服務器。 由於我的對象被jinja2模板解析,所以不可能通過jinja2創建一個Image對象。 所以最終的解決方案工作如下:

class Mandelbrot(db.Model): 
    image = blobstore.BlobReferenceProperty() 

@property 
def image_url(self): 
    return images.get_serving_url(self.image) 

這樣我可以解析圖像的URL到我的網頁,如:

<img src= 
{% if mandelbrot.image %} 
    "{{ mandelbrot.image_url }}" 
{% else %} 
    "./assets/img/preloader.gif" 
{% endif %} 
/> 
+0

要解釋一點。沒有調整大小的第一個方法不提供有效的圖像資源。這是問題,而不是規模。 –

+0

你的問題真的不是關於PIL,你應該改變標題。谷歌可能會使用PIL來實現它的Image類,但它是一個完全獨立的東西。 –

+0

@MarkRansom行會OK! –

回答

3

卻不是因與PIL familiair,因爲我用另一種解決方案,從谷歌的服務,並調整圖片大小。 Google可以使用Google高性能圖片服務爲您提供圖片。這意味着:

  • 你必須創建一次,使用Blob存儲區進行圖像serving_url:get_serving_url
  • 可以更改投放的圖片的大小。原文不變
  • Google將爲您免費提供這些圖片。你不需要處理程序。你只支付帶寬

這裏是一個例子。您可以更改= s0,更改大小。 s0返回原始大小。

https://lh6.ggpht.com/1HjICy6ju1e2GIg83L0qdliUBmPHUgKV8FP3QGK8Qf2pHVBfwkpO_V38ifAPm-9m20q_3ueZzdRCYQNyDE3pmA695iaLunjE=s0 

get_serving_url文檔:https://developers.google.com/appengine/docs/python/images/functions

代碼:

class Dynamic(db.Model):   # key : name 
    name = db.StringProperty() 
    blob_ref = blobstore.BlobReferenceProperty() 
    serving_url = db.LinkProperty() 

dyn= Dynamic.get_by_key_name(key_name) 
try :  # get url with size = 0 
    dyn.serving_url = images.get_serving_url(dyn.blob_ref, size=None, secure_url=True) 
except DeadlineExceededError : 
    try :    # sometimes this request fails, retry. This always works fine 
     dyn.serving_url = images.get_serving_url(dyn.blob_ref, size=None, secure_url=True) 
    except DeadlineExceededError : 
     logging.error('Image API get_serving_url deadline error after retry' %(dyn.key().name()))       
     return None 
    dyn.put() 
+0

同意這是最好的方法。謝謝您的回答。 但一個簡單的問題。如果您想通過模板獲取服務網址? 例如: 'object.image = self._save_to_blobstore_and_get_key(image)' 某人在解析對象到模板時如何在沒有首先創建圖像對象的情況下檢索url? –

+0

我使用的數據存儲實體引用了blobstore(上次上傳的版本)和serving_url。創建模板時,我使用此實體填充模板,並將大小(s = xxx)添加到模板中。我不明白你的代碼,所以我編輯了我的答案來添加代碼。 – voscausa

+0

是你的例子是正確的,儘管你在哪裏更快! 另外你的例子是節省資源,而不是總是調用'get_serving_url()' 也請參閱我修正的例子 –

1

它看起來像PIL doesn't implement .size的GAE版本。使用這樣的事情,而不是:

logging.info((img.width, img.height)) 
+0

我的問題@Blender沒有得到大小,但提供圖像。 忽視大小。這只是供參考。 –