1

PythonスクリプトからGoogle App EngineのPythonイメージングライブラリを使用して、ローカルファイルシステムからイメージファイルをロードすることはできますか? それとも、データストアから画像をロードする必要がありますか? テキスト ファイルを正常に読み込んで、その内容を表示できます。

Python 2.7 で Google アプリ エンジンを使用し、PIL イメージング ライブラリを使用しています。Mac OS X 10.8.2 で PyCharm と Google App Engine Launcher を使用しています。ソースからビルドした PIL のバージョン 1.1.7 を使用しています。

Python スクリプトの応答出力で画像を返す前に、画像 (または複数の画像) に対して何らかの操作を実行したいと考えています。

この関数を使用するImage.image( filename=<filename> )と、ファイル名は「/gs」で始まる必要があるというエラーが表示されます。__init()__Image オブジェクトのメソッドにステップblobstore.create_gs_key()インすると、Image コンストラクターにファイル名を指定すると、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

画像を静的に提供することで同じ結果が得られることは理解していますが、画像を正常にロードできたら、提供する前に操作したいと考えています。アプリケーションからロードしたい画像を意図的に配置しましたが、Google App Engine Web サーバーによって静的コンテンツとして提供されていません/images。これらは、 というサブディレクトリにありgs/challengeます。

支援、提案、または解決策は大歓迎です。おそらく、私はこれについて完全に間違った方法で進んでいますか?

4

2 に答える 2

0

アプリケーションと一緒にファイルをアップロードするだけで、必要に応じてローカル ファイル システムからファイルをロードできます。

それらは決して変更されず、アプリケーションをデプロイするとき以外は変更できないこと、およびデプロイされたアプリケーションが占有できるスペースの量には制限があることを認識している限り、問題ありません。

たとえば、アプリケーションと一緒に .csv ファイルをアップロードすると、最初の起動時にファイルが読み取られ、その内容に関連するデータストアにレコードが作成されます。その後、そのファイルを二度と使用しません。

画像をユーザーに提供する前に操作しているため、画像を配置する場所は実際には関係ありません。それらは「静的コンテンツ」ではなく、ユーザーに直接提供されません (.c​​ss ファイルは例)。アプリケーションがそれらをロードできる限り、それが適切な場所です。

于 2012-12-05T09:24:33.057 に答える
0

あなたは部分的に間違っていました/正しかったです。最終的に、この方法で PIL を使用してメモリからファイルを開くことができました。インポートの一部は不要かもしれませんが、w/e:

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

rawdata = open(fullpathtoimagefile).read()
stream = BytesIO(rawdata)
im = Image.open(stream)
于 2015-07-07T02:52:43.057 に答える