如果用戶上傳圖片,並使用PIL調整大小,我會得到一個PIL Image object。如何在模板中顯示PIL圖像對象?
在將模板保存到數據庫之前,如何在模板中顯示PIL Image
文件?它甚至可以作爲圖像傳遞並呈現?
如果用戶上傳圖片,並使用PIL調整大小,我會得到一個PIL Image object。如何在模板中顯示PIL圖像對象?
在將模板保存到數據庫之前,如何在模板中顯示PIL Image
文件?它甚至可以作爲圖像傳遞並呈現?
對於一套有限的瀏覽器,您可以對圖像進行base64編碼並使用內嵌圖像。見Embedding Base64 Images。
適用於所有瀏覽器的解決方案是引用view that returns the image的圖像標籤。
[更新]
我要的是對用戶提交的原始圖像,然後通過另一種形式的輸入被提示輸入圖像的標題(與調整後的圖像來的左字幕字段)。然後,當用戶點擊「提交」圖像和標題被保存在模型實例中。
嗯......當您使用<img src="foo">
,富總是由GET檢索也許這就是爲什麼它不工作 - request.FILES將無法在GET請求可用。如果您打開螢火蟲或Chrome調試工具欄,在網絡標籤中,您將看到帶有上傳圖像的POST請求,並在此之後發出GET請求來獲取圖像。
您必須將圖像保存在兩個步驟之間的某處。
我還能保存嗎?我會喜歡它是暫時的。你認爲有這樣一個非常簡單的方法,或者我應該看看這些選項?
熱門選擇是redis和memcached。你可以把它們想象成巨大的共享python字典,並且過期日期。如果圖像很小,就像化身一樣,您也可以將圖像數據保存到會話變量中。
您可以將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。
這工作後我刪除了這行:contents = contents.split('\ n')[0] – Yerke
是的,沒有。
是的,你可以把圖像作爲原始的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文件返回,然後在頁面上的img
href
屬性中引用該視圖。
您確定要直接從您的Django進程提供圖片嗎?它不僅會佔用寶貴的內存,它還會捆綁一個線程或進程 –
(沒有任何確鑿的證據)我認爲保存圖像並讓前端Web服務器爲您進行字節洗牌要好得多。看看X-Sendfile(Apache)或X-Accel-Redirect(Nginx)。 –