使用Python Base64压缩GAE Blob图像?

时间:2011-04-04 06:07:07

标签: python image google-app-engine base64 blob

我正在向iPhone应用程序提取20个随机缩略图的JSON请求。目前我只是将图像拇指URL包含在JSON数组中(见下文),然后iPhone出去获取每个图像。这真的很慢。

原始JSON请求:

{
  "item_list": [
    {
      "item_name": "Item One", 
      "user_item_thumb": "http://localhost:8080/i/agpwaGluZ28tYXBwcg4LEghJdGVtVXNlchgPDA/67x67", 
    }, 
    {
      "item_name": "Item Two", 
      "user_item_thumb": "http://localhost:8080/i/agpwaGluZ28tYXBwcg4LEghJdGVtVXNlchgQDA/67x67", 
    }, 
    {
      "item_name": "Item Three", 
      "user_item_thumb": "http://localhost:8080/i/agpwaGluZ28tYXBwcg4LEghJdGVtVXNlchgRDA/67x67", 
    }
  ]
}

所以,我在想的是在图像数据上使用Base64并将其实际包含在JSON请求中,因此iPhone只需要一个请求而不是21个请求。合理?

那么,我该怎么做呢? 我试着简单地将下面的内容打印到JSON,但这些是全尺寸图像,我需要推送缩略图的Base64版本。

不工作:

  

f = item.image
  f_enc = f.encode('base64')

这就是我现在抓住拇指的方式,只是在飞行中创建它们。

  

http://localhost:8080/i/agpwaGluZ28tYXBwcg4LEghJdGVtVXNlchgSDA/67x67

这是呈现上述图像请求的内容:

class Image(webapp.RequestHandler):
    def get(self, image_id):
        user = db.get(image_id)

        if user.image:
            picture = user.image
            self.response.headers['Content-Type'] = "image/png"
            self.response.out.write(picture)
        else:
            self.response.out.write("No image")

任何想法都会令人惊讶 如果有更好的方法,我会全力以赴。

我的问题:
  - iPhone在这20张图片中都很慢   - 图像是随机的,因此缓存可能不是一种选择   - Base64是可行的吗?

谢谢,
丹尼

2 个答案:

答案 0 :(得分:1)

是的,使用base64直接编码图像似乎是一种合理的方法,因为它们只是缩略图。这类似于在网页中使用data:网址的原因相同。

这样做应该像调用常规代码中的相同Images API转换一样简单,以生成缩略图,然后将生成的输出序列化为base64。您可能希望将结果缓存在memcache中 - 在两个处理程序中 - 以防止对Images API的冗余调用。或者,您可以在首次上传图像时计算缩略图,并将其与全尺寸图像一起存储。

答案 1 :(得分:0)

也许您只需要致电read()

encoded = item.image.read().encode('base64')

如果你正在处理任何大尺寸的图像,你需要以块为单位进行编码(即read(4096)多次编码,编码每一块。)