如何使用Python Base64压缩GAE Blob图像?

2 投票
2 回答
1702 浏览
提问于 2025-04-16 15:02

我正在为一个iPhone应用程序请求20个随机缩略图的JSON数据。目前,我只是把这些图片的缩略图链接放在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是否可行?

谢谢,
Danny

2 个回答

0

也许你只需要调用一下 read() 方法。

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

如果你处理的图片比较大,建议分块来编码,也就是说可以多次使用 read(4096),每次处理一小部分。

1

是的,直接用base64编码图片听起来是个不错的主意,尤其是因为这些只是缩略图。这就像在网页中使用data: URL一样,都是为了同样的目的。

这样做应该很简单,只需要调用你在正常代码中用来生成缩略图的Images API,然后把得到的结果转成base64格式。你可能还想在两个处理程序中把结果缓存到内存缓存中,这样就可以避免重复调用Images API。或者,你也可以在第一次上传图片时就计算出缩略图,并把它和原图一起存储。

撰写回答