1

使用 Python 图像库 PIL 和 Google App Engine Blobstore...

这:

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'

那么来自谷歌应用引擎的图像实例没有大小?

那么这是如何工作的:

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 %}
/>
4

2 回答 2

3

我不熟悉 PIL,因为我使用 Google 的另一种解决方案来提供图像和调整图像大小。Google 可以使用 Google 高性能图像服务为您提供图像。这表示:

  • 您必须使用以下命令为 blobstore 中的图像创建一次 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()
于 2012-12-10T23:46:55.063 回答
1

看起来 PIL 的 GAE 版本没有实现.size. 改用这样的东西:

logging.info((img.width, img.height))
于 2012-12-10T23:06:23.107 回答