【问题标题】:How do you store an app engine Image object in the db?您如何在数据库中存储应用引擎图像对象?
【发布时间】:2009-04-18 02:36:47
【问题描述】:

我的代码有点卡住了:

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 - 所以 img.read() 工作正常。

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

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

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

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

感谢任何指点:)

【问题讨论】:

    标签: python google-app-engine image


    【解决方案1】:

    这可能会起作用:

    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】:

      我对这个解决方案不满意,因为它不会将 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)
      

      【讨论】:

      • 您在这里所做的完全正确。 Blob 只是一个字符串子类,你需要做的就是像这里一样构造一个。
      【解决方案3】:

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

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

      【讨论】:

      • 不,它没有帮助 - 他们不创建任何图像对象,但只使用调整大小操作。我需要获取图像的宽度和高度,据我所知,如果不创建 Image 对象就无法完成。
      猜你喜欢
      • 2011-08-12
      • 1970-01-01
      • 1970-01-01
      • 2014-03-28
      • 2011-11-21
      • 1970-01-01
      • 1970-01-01
      • 2013-07-16
      • 2011-05-02
      相关资源
      最近更新 更多