Сжатие изображений GAE Blob с помощью Python Base64? - PullRequest
2 голосов
/ 04 апреля 2011

Я перетаскиваю запрос JSON из 20 случайных миниатюр в приложение для iPhone. На данный момент я просто включаю 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, но это полноразмерные изображения, мне нужно отправить версию Thumbnails для 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 ]

1 голос
/ 04 апреля 2011

Да, кодирование изображений напрямую с использованием base64 кажется разумным подходом, учитывая, что это всего лишь миниатюры. Это похоже на использование data: URL-адресов на веб-странице по той же причине.

Выполнение этого должно быть таким же простым, как вызов тех же преобразований API изображений, которые вы выполняете в обычном коде для генерации миниатюры, а затем сериализации полученного результата как base64. Вы, вероятно, хотите кэшировать результат в memcache - в обоих обработчиках - чтобы предотвратить избыточные вызовы к API изображений. Кроме того, вы можете рассчитать эскиз при первой загрузке изображения и сохранить его рядом с полноразмерным изображением.

0 голосов
/ 04 апреля 2011

Возможно, вам просто нужно позвонить read()

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

Если вы имеете дело с изображениями любого большого размера, вам нужно будет кодировать их кусками (т.е. read(4096) несколько раз, кодируя каждый фрагмент).

...