从文件系统谷歌应用引擎加载图像

时间:2012-12-05 06:11:44

标签: image google-app-engine python-2.7 python-imaging-library

是否可以使用来自python脚本的google app引擎python映像库从本地文件系统加载图像文件?或者必须从数据存储区加载图像?我可以成功加载文本文件并显示它的内容。

我正在使用带有Python 2.7的谷歌应用引擎并使用PIL成像库。我在Mac OS X 10.8.2上使用PyCharm和Google App Engine Launcher。我正在使用我从源代码构建的PIL 1.1.7版本。

我想在图像(或图像)上执行一些操作,然后在我的python脚本的响应输出中返回它们。

当我使用Image.image( filename=<filename> )函数时,我得到的错误告诉我文件名必须以“/ gs”开头。单步进入Image对象的__init()__方法,向我显示如果我向Image构造函数提供文件名,blobstore.create_gs_key()用于创建一个blobkey。

因为我有一组固定的图像需要操作,所以我希望避免将它们手动上传到数据存储区进行检索。

我的普通应用程序处理程序目前看起来像这样;

class ChallengeImageHandler( webapp2.RequestHandler ):
    def get(self):
        olifant = images.Image( filename='gs/challenge/C017.png' )
        logging.debug( "olifant.width=%d" % olifant.width );
        logging.debug( "olifant.height=%d" % olifant.height );
        self.response.headers[ 'Content-Type' ] = 'image/png'
        self.response.out.write( olifant )
        return

我的app.yaml看起来像这样;

application: hello_world
version: 1
runtime: python27
api_version: 1
threadsafe: true


handlers:

- url: /stylesheets
  static_dir: stylesheets

- url: /images
  static_dir: images

- url: /.*
  script: main.application

- url: /software_development.html
  script: main.application

libraries:
- name: jinja2
  version: latest
- name: PIL
  version: latest

我知道我可以通过静态提供图像来获得相同的结果,但是一旦我成功加载了图像,我希望在提供图像之前对其进行操作。我故意放置了我希望从我的应用程序加载的图像,而不是谷歌应用引擎网络服务器在/images以外的单独目录中作为静态内容。它们位于名为gs/challenge的子目录中。

非常感谢任何帮助,建议或解决方案。也许我会以完全错误的方式解决这个问题?

2 个答案:

答案 0 :(得分:0)

如果您只想将文件与应用程序一起上传,则可以从本地文件系统加载文件。

只要您意识到它们永远不会更改,除非您部署应用程序时无法更改它们,并且部署的应用程序可以占用的空间量有限,您应该没问题。

例如,我将.csv文件与我的应用程序一起上传,当它第一次启动时,它会读取它并在数据存储区中创建与其内容相关的记录。然后我再也不用那个文件了。

放置图像的位置并不真正相关,因为您在向用户提供图像之前操作它们并不是“静态内容”,因此不会直接向用户提供(作为.css文件)例如)。只要您的应用程序可以加载它们就是正确的位置。

答案 1 :(得分:0)

你有些错误/对,我终于能够以这种方式使用PIL从内存中打开一个文件,一些导入可能是不必要的但是没有:

from PIL import Image, ImageDraw, ImageFont
from io import BytesIO

rawdata = open(fullpathtoimagefile).read()
stream = BytesIO(rawdata)
im = Image.open(stream)