2013-01-15 44 views
15

如果用戶上傳圖片,並使用PIL調整大小,我會得到一個PIL Image object如何在模板中顯示PIL圖像對象?

在將模板保存到數據庫之前,如何在模板中顯示PIL Image文件?它甚至可以作爲圖像傳遞並呈現?

+1

您確定要直接從您的Django進程提供圖片嗎?它不僅會佔用寶貴的內存,它還會捆綁一個線程或進程 –

+1

(沒有任何確鑿的證據)我認爲保存圖像並讓前端Web服務器爲您進行字節洗牌要好得多。看看X-Sendfile(Apache)或X-Accel-Redirect(Nginx)。 –

回答

13

對於一套有限的瀏覽器,您可以對圖像進行base64編碼並使用內嵌圖像。見Embedding Base64 Images

適用於所有瀏覽器的解決方案是引用view that returns the image的圖像標籤。

[更新]

我要的是對用戶提交的原始圖像,然後通過另一種形式的輸入被提示輸入圖像的標題(與調整後的圖像來的左字幕字段)。然後,當用戶點擊「提交」圖像和標題被保存在模型實例中。

嗯......當您使用<img src="foo">,富總是由GET檢索也許這就是爲什麼它不工作 - request.FILES將無法在GET請求可用。如果您打開螢火蟲或Chrome調試工具欄,在網絡標籤中,您將看到帶有上傳圖像的POST請求,並在此之後發出GET請求來獲取圖像。

您必須將圖像保存在兩個步驟之間的某處。

我還能保存嗎?我會喜歡它是暫時的。你認爲有這樣一個非常簡單的方法,或者我應該看看這些選項?

熱門選擇是redismemcached。你可以把它們想象成巨大的共享python字典,並且過期日期。如果圖像很小,就像化身一樣,您也可以將圖像數據保存到會話變量中。

+0

我將如何引用圖片標籤中的視圖? – sgarza62

+1

'the same url from urls.py, got it?' –

+0

到目前爲止,感謝您的幫助,我對延遲表示歉意......我一直試圖讓這個與我的代碼一起工作。我能夠將'Image'保存到'HttpResponse'對象(謝謝!),但是我無法從模板中的圖像標記中使用它。也許我沒有在URL中傳遞某個參數,我不確定。 – sgarza62

6

您可以將base64編碼圖像嵌入到標籤中。所以你可以將PIL圖像轉換爲base64然後顯示它。

from PIL import Image 
import StringIO 

x = Image.new('RGB',(400,400)) 
output = StringIO.StringIO() 
x.save(output, "PNG") 
contents = output.getvalue().encode("base64") 
output.close() 
contents = contents.split('\n')[0] 

然後顯示與:

<img src="data:image/png;base64,' + contents + ' /> 

查找到example output

+0

這工作後我刪除了這行:contents = contents.split('\ n')[0] – Yerke

14

是的,沒有。

是的,你可以把圖像作爲原始的Base64數據。這裏有一個腳本可以用來測試:

import Image 
import base64 
import StringIO 
output = StringIO.StringIO() 
im = Image.open("test.png") # Your image here! 
im.save(output, format='PNG') 
output.seek(0) 
output_s = output.read() 
b64 = base64.b64encode(output_s) 
open("test.html","w+").write('<img src="data:image/png;base64,{0}"/>'.format(b64)) 

但是,這是一個非常糟糕的主意。使用多個縮略圖,您的單個HTML頁面可能爲10MB +。

你真正應該做的是使用單獨的Django視圖將PIL對象中的圖像作爲PNG文件返回,然後在頁面上的imghref屬性中引用該視圖。