1

是否有可能從Python腳本使用谷歌應用程序引擎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的目錄中,而不是由Google應用程序引擎Web服務器將其作爲靜態內容。它們位於名爲gs/challenge的子目錄中。

任何援助,建議或解決方案非常感謝。也許我正在以完全錯誤的方式解決這個問題?

回答

0

如果您只需將它們與應用程序一起上傳,就可以從本地文件系統加載文件。

只要您意識到他們永遠不會改變,除非部署應用程序,並且部署的應用程序可佔用的空間量有限制,否則無法更改它們,您應該可以。

例如,我將一個.csv文件與我的應用程序一起上傳,並在第一次啓動時將其讀取並在與其內容相關的數據存儲中創建一條記錄。然後我再也不使用該文件。

你放置圖像的位置並不相關,因爲在將它們提供給用戶之前,他們正在操作它們,因此它們不是「靜態內容」,因此不會直接提供給用戶(作爲.css文件將是例如)。只要你的應用程序可以加載它們,那就是正確的地方。

+0

我不同意。您可以將圖像放入Blobstore中,並使用帶有get_serving_url的Google高性能圖像服務。這不是非常快,但你也不必自己提供圖像,而且幾乎是免費的。這是一個get_serving_url的例子:https://lh6.ggpht.com/1HjICy6ju1e2GIg83L0qdliUBmPHUgKV8FP3QGK8Qf2pHVBfwkpO_V38ifAPm-9m20q_3ueZzdRCYQNyDE3pmA695iaLunjE=s0 – voscausa

+0

我並不反對這一切,但提問者似乎想避免,由於某種原因,把這個內容在任何類型的blobstore。我個人會按你的建議去做。 –

+0

PaulC,感謝您的回覆。我已經能夠加載一個文本文件並顯示它的內容。所以我明白可以在app引擎項目中打開/加載文件。我在做什麼特別麻煩,是從本地文件系統加載圖像。我準備使用blobstore,只是想知道如果沒有額外的步驟是否可能。 – DavrosYoung

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)