2013-01-15 49 views
15

यदि कोई उपयोगकर्ता कोई छवि अपलोड करता है, और मैं इसे पीआईएल का उपयोग करके आकार बदलता हूं, तो मुझे PIL Image object मिलता है।मैं एक टेम्पलेट में एक पीआईएल छवि वस्तु कैसे प्रदर्शित करूं?

डेटाबेस में सहेजे जाने से पहले, मैं टेम्पलेट में PIL Image फ़ाइल कैसे प्रदर्शित करूं? क्या इसे एक छवि के रूप में भी पारित किया जा सकता है और प्रस्तुत किया जा सकता है?

+1

क्या आप वाकई अपनी Django प्रक्रिया से सीधे छवि की सेवा करना चाहते हैं?न केवल यह कीमती स्मृति का उपभोग करेगा, यह एक धागे को भी बांध देगा या –

+1

(किसी भी कठोर सबूत के बिना) मुझे लगता है कि आप छवि को सहेजने से पहले बेहतर हैं और सामने वाले वेबसर्वर को आपके लिए बाइट-शफल करना है। एक्स-सेंडफाइल (अपाचे) या एक्स-एक्सेल-रीडायरेक्ट (Nginx) पर एक नज़र डालें। –

उत्तर

13

ब्राउज़र के सीमित सेट के लिए, आप छवि को एन्कोड कर सकते हैं और इनलाइन छवियों का उपयोग कर सकते हैं। Embedding Base64 Images देखें।

एक समाधान जो सभी ब्राउज़रों के लिए काम करता है वह एक छवि टैग है जो view that returns the image का संदर्भ देता है।

[अद्यतन]

सभी मैं चाहता हूँ उपयोगकर्ता मूल छवि प्रस्तुत करने के लिए, और उसके बाद के लिए इनपुट करने के लिए एक और रूप से (छवि के लिए एक शीर्षक के बाईं का आकार बदला छवि के साथ संकेत दिया है कैप्शन फ़ील्ड)। फिर जब उपयोगकर्ता छवि सबमिट "हिट" करता है और कैप्शन मॉडल उदाहरण में सहेजा जाता है।

खैर ... जब आप <img src="foo"> उपयोग करते हैं, foo हमेशा एक प्राप्त द्वारा लिया गया है शायद यही वजह है कि यह काम नहीं कर रहा है - request.FILES GET अनुरोध में उपलब्ध नहीं होगा। यदि आप फ़ायरबग या क्रोम डीबग टूलबार खोलते हैं, तो नेटवर्क टैब में, आप अपलोड की गई छवि के साथ POST अनुरोध देखेंगे और उसके बाद छवि प्राप्त करने के लिए एक GET अनुरोध देखेंगे।

आपको छवि को दोनों चरणों के बीच कहीं सेव करना होगा।

मैं इसे और कैसे बचा सकता हूं? मैं इसके लिए अस्थायी होने के लिए प्यार करता हूँ। क्या आपको लगता है कि ऐसा करने का एक आसान तरीका है, या क्या मुझे उन विकल्पों में देखना चाहिए?

लोकप्रिय विकल्प redis और memcached हैं। आप उन्हें एक विस्तृत तिथि के साथ विशाल साझा पायथन निर्देश के रूप में सोच सकते हैं। यदि छवियां अवतार की तरह छोटी हैं, तो आप एक सत्र चर में छवि डेटा भी सहेज सकते हैं।

+0

मैं छवि टैग से किसी दृश्य को कैसे संदर्भित करूं? – sgarza62

+1

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

+0

अब तक आपकी सहायता के लिए धन्यवाद, मैं देरी के लिए क्षमा चाहता हूं ... मैं इसे अपने कोड के साथ काम करने की कोशिश कर रहा हूं। मैं 'छवि' को 'HttpResponse' ऑब्जेक्ट (धन्यवाद!) में सहेजने में सक्षम था, लेकिन मुझे टेम्पलेट में छवि टैग से काम करने में परेशानी हो रही है। शायद मैं यूआरएल में एक निश्चित पैरामीटर नहीं पारित कर रहा हूं, मुझे यकीन नहीं है। – sgarza62

6

आप बेस 64 एन्कोडेड छवियों को टैग में एम्बेड कर सकते हैं। तो आप पीआईएल छवि को बेस 64 में परिवर्तित कर सकते हैं और फिर इसे प्रदर्शित कर सकते हैं।

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

एक example output को देखो:

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] 

फिर से दिखाई देते हैं।

+0

यह इस पंक्ति को हटाने के बाद मेरे लिए काम किया: सामग्री = content.split ('\ n') [0] – Yerke

14

हां और नहीं।

हां, आप छवियों को कच्चे बेस 64 डेटा के रूप में रख सकते हैं। यहां एक छोटी सी स्क्रिप्ट है जिसका आप इसका परीक्षण करने के लिए उपयोग कर सकते हैं:

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 दृश्य का उपयोग करना है, और उसके बाद imghref गुणों में उस दृश्य को संदर्भित करना।