2013-07-21 56 views
1
返回動態PNG

我試圖做的是有我的主塔應用程序動態生成基於一些數據的圖像,並以這樣的方式,它可以在瀏覽器中查看返回。從主塔

到目前爲止我生成我的形象是這樣的:

import Image, ImageDraw 
image = Image.new("RGB", (width, height),"black") 
img_out = ImageDraw.Draw(image) 
img_out.polygon(... 
img_out.text(... 
#etc 

的圖像被成功生成,甚至可以保存到文件中是這樣的:

img_out.save(filepath) 

我的問題是,我不是試圖寫入磁盤,而是通過Pylons響應返回。根據關答案的another question我能夠遠遠地得到這樣的:

import FileApp 
my_headers = [('Content-Disposition', 'attachment; filename=\"' + user_filename + '\"'), ('Content-Type', 'text/plain')] 
file_app = FileApp(filepath, headers=my_headers) 
return file_app(request.environ, self.start_reponse) 

使用該解決方案,我可以拿我已經保存在服務器端的PNG文件並返回給用戶下載。但是,這裏有兩個問題。首先,我被迫將文件寫入磁盤,然後從磁盤提供,而不是直接從代碼中直接使用該圖像。第二個是它實際上是返回文件,因此用戶被迫下載它而不是在瀏覽器中查看它。

我要的是用戶是能查看該文件在他們的瀏覽器,而不是下載它自己。理想情況下,我不必將圖像保存到服務器端的磁盤上,但是我發現如果服務器或客戶端計算機上沒有它,它可能無法提供服務。

所以我的問題是這樣的。我是否可以直接從代碼提供圖像,以便用戶只需在瀏覽器中將圖像視爲對其請求的迴應?如果沒有,我可以將圖像保存到磁盤服務器端並從那裏提供,以便用戶可以在瀏覽器中看到圖像,而不會提示下載文件?

(對於什麼是值得我用Python 2.6.2和PasteScript 1.7.4.2)

回答

1

瀏覽器可以接受原始數據編碼爲img的BASE64的src屬性的一部分......

from PIL import Image 
from cStringIO import StringIO 

a = Image.new('RGB', (10, 10), 'black') 
# ... 
buf = StringIO() 
a.save(buf, 'png') 
b64img = '<img src="data:image/png;base64,{0}" />'.format(buf.getvalue().encode('base64')) 

所以你在這裏做的是建立你的圖像,將其保存到內存(而不是磁盤)的字符串緩衝區,然後將其編碼爲base64 ...您將<img>標記作爲頁面的一部分返回(或純粹本身如果是懶惰)使用任何模板/等...也許只是一個return Response(b64img)會做到這一點...

+0

我沒意識到你可以用這種方式返回緩衝區。這正是我所期待的,非常感謝。 –