0

大家好,一般的想法是创建一个类似星系的地图。当我尝试显示生成的图像时遇到问题。我使用 Python Image 库来创建图像并将其存储在数据存储中。

当我尝试加载图像时,日志控制台上没有错误,浏览器上也没有图像。当我复制/粘贴图像链接(包括数据存储密钥)时,出现黑屏和以下消息:

图像“view-source:/localhost:8080/img?img_id=ag5kZXZ-c3BhY2VzaW0xMnINCxIHTWFpbk1hcBgeDA”无法显示,因为它包含错误。

火狐错误控制台:

错误:图像损坏或截断:/localhost:8080/img?img_id=ag5kZXZ-c3BhY2VzaW0xMnINCxIHTWFpbk1hcBgeDA

import cgi
import datetime
import urllib
import webapp2
import jinja2
import os
import math
import sys



from google.appengine.ext import db
from google.appengine.api import users
from PIL import Image

#SNIP

#class to define the map entity
class MainMap(db.Model):
  defaultmap = db.BlobProperty(default=None)

#SNIP      


class Generator(webapp2.RequestHandler):
  def post(self):

        #SNIP

        test = Image.new("RGBA",(100, 100))
        dMap=MainMap()
        dMap.defaultmap = db.Blob(str(test))
        dMap.put()

        #SNIP

        result = db.GqlQuery("SELECT * FROM MainMap LIMIT 1").fetch(1)

        if result:
          print"item found<br>" #debug info

          if result[0].defaultmap:
              print"defaultmap found<br>" #debug info
              string = "<div><img src='/img?img_id=" + str(result[0].key()) + "' width='100' height='100'></img>"
              print string

        else:
            print"nothing found<br>"

    else:
        self.redirect('/?=error')
    self.redirect('/')


class Image_load(webapp2.RequestHandler):
    def get(self):
        self.response.out.write("started Image load")
        defaultmap = db.get(self.request.get("img_id"))
        if defaultmap.defaultmap:
            try:
              self.response.headers['Content-Type'] = "image/png"
              self.response.out.write(defaultmap.defaultmap)
              self.response.out.write("Image found")
            except:
              print "Unexpected error:", sys.exc_info()[0]
        else:
            self.response.out.write("No image")

#SNIP    



app = webapp2.WSGIApplication([('/', MainPage),
                               ('/generator', Generator),
                               ('/img', Image_load)],
                              debug=True)

浏览器显示“找到的项目”和“找到的默认地图”字符串和损坏的图像链接异常处理没有捕获任何错误

感谢您的帮助问候伯特

4

2 回答 2

1

PIL Image 对象到字符串的转换不是图像:

>>> from PIL import Image
>>> i = Image.new("RGBA", (100, 100))
>>> str(i)
'<PIL.Image.Image image mode=RGBA size=100x100 at 0x24C5DA0>'

相反,您需要使用该save()函数并将其写入文件。在应用引擎的情况下,您使用字符串缓冲区:

>>> import cStringIO
>>> s = cStringIO.StringIO()
>>> i.save(s, 'PNG')
>>> dMap.defaultmap = db.Blob(s.getvalue())

对于 ndb,当 dMap.defaultmap 是ndb.BlobProperty

>>> import cStringIO
>>> s = cStringIO.StringIO()
>>> i.save(s, 'PNG')
>>> dMap.defaultmap = s.getvalue()
于 2012-05-31T18:51:36.327 回答
0

我怀疑你的图像是一个字符串

>>> test = Image.new("RGBA",(100, 100))
>>> test
<Image.Image image mode=RGBA size=100x100 at 0x1005EC878>
>>> str(test)
'<Image.Image image mode=RGBA size=100x100 at 0x1005EC878>'

Image 有一个 save 方法,可以将其写入类似文件的对象。

我认为以下(未经测试)可能适用于 blobstore 如果defaultmap = blobstore.BlobReferenceProperty()

from google.appengine.api import files
file_name = files.blobstore.create(mime_type='image/png')
with files.open(file_name, 'a') as f:
    test.save(f, format='PNG')
files.finalize(file_name)
blob_key = files.blobstore.get_blob_key(file_name)

或者你可以例如实例化一个 StringIO 并保存到它,比如

from StringIO import StringIO
tmp = StringIO()
test.save(tmp, format='PNG')
dMap.defaultmap = db.Blob(tmp.getvalue())
于 2012-05-31T14:50:38.957 回答