是否可以使用来自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
的子目录中。
非常感谢任何帮助,建议或解决方案。也许我会以完全错误的方式解决这个问题?
答案 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)