如何在数据库中存储应用程序引擎Image对象?

时间:2009-04-18 02:36:47

标签: python google-app-engine image

我的代码有点困惑:

def setVenueImage(img):
  img = images.Image(img.read())
  x, y = photo_utils.getIdealResolution(img.width, img.height)
  img.resize(x, y)
  img.execute_transforms()
  venue_obj = getVenueSingletonObject()
  if venue_obj is None:
      venue_obj = Venue(images = [img])
  else:
      venue_obj.images.append(img)
  db.put(venue_obj)

我正在使用django和app引擎 - 所以img.read()工作正常。

事实上,在我尝试将img存储到数据库之前,所有这些代码都可以正常工作。我的模型需要一个Blob,所以当我将图像作为img放入时,它会抛出一个拟合,然后我得到:

  

/ admin / venue /的BadValueError   图像列表中的项目必须都是Blob实例

好的,所以Image不能是Blob,但是如何让它成为blob? Blob接受一个字节字符串,但是如何使我的图像成为字节串?

我没有在文档中看到他们实际使用图像对象的任何地方,所以我不确定这一切是如何工作的,但我确实想要使用图像对象来调整大小我的形象(我知道你可以在PIL中完成它,但我想知道如何使用谷歌的Image类)。

感谢您的任何指示:)

3 个答案:

答案 0 :(得分:2)

我对这个解决方案不满意,因为它没有将Image对象转换为blob,但它暂时会这样做:

def setVenueImage(img):
  original = img.read()
  img = images.Image(original)
  x, y = photo_utils.getIdealResolution(img.width, img.height)
  img = images.resize(original, x, y)
  venue_obj = getVenueSingletonObject()
  if venue_obj is None:
      venue_obj = Venue(images = [db.Blob(img)])
  else:
      venue_obj.images.append(db.Blob(img))
  db.put(venue_obj)

答案 1 :(得分:2)

这可能会奏效:

def setVenueImage(img):
  img = images.Image(img.read())
  x, y = photo_utils.getIdealResolution(img.width, img.height)
  img.resize(x, y)
  img_bytes = img.execute_transforms() # Converts to PNG
  venue_obj = getVenueSingletonObject()
  if venue_obj is None:
      venue_obj = Venue(images = [img_bytes])
  else:
      venue_obj.images.append(img_bytes)
  db.put(venue_obj)

我假设Venue.images是一个ListProperty(db.Blob),对吗?这可能是错误的做法。使用简单的blob属性定义VenueImage模型并将其密钥存储到Venue中。如果您直接将图像放在那里,您将在数据存储上达到1MB的行限制。

答案 2 :(得分:0)

http://code.google.com/appengine/docs/python/images/usingimages.html

我认为该链接应该有所帮助。祝你好运。