2011-09-12 12 views
107

जो मैं करने की कोशिश कर रहा हूं वह काफी सरल है जब हम स्थानीय फ़ाइल से निपट रहे हैं, लेकिन समस्या तब आती है जब मैं रिमोट यूआरएल के साथ ऐसा करने की कोशिश करता हूं।पायथन में यूआरएल से मैं छवि डेटा कैसे पढ़ूं?

असल में, मैं एक यूआरएल से खींची गई फाइल से पीआईएल छवि ऑब्जेक्ट बनाने की कोशिश कर रहा हूं। निश्चित रूप से, मैं हमेशा यूआरएल ला सकता हूं और इसे एक अस्थायी फ़ाइल में संग्रहीत कर सकता हूं, फिर इसे एक छवि ऑब्जेक्ट में खोल सकता हूं, लेकिन यह बहुत अक्षम लगता है।

यहाँ मैं क्या है: यह शिकायत करते हुए

Image.open(urlopen(url)) 

यह पता गुच्छे कि seek() उपलब्ध नहीं है तो फिर मैं इस कोशिश की:

Image.open(urlopen(url).read()) 

लेकिन है कि या तो काम नहीं किया। क्या ऐसा करने का कोई बेहतर तरीका है, या एक अस्थायी फ़ाइल को इस तरह की चीज करने का स्वीकार्य तरीका लिख ​​रहा है?

+0

यह भी देखें: (http://stackoverflow.com/q/8286352/562769) –

उत्तर

145

आप एक StringIO

import urllib, cStringIO 

file = cStringIO.StringIO(urllib.urlopen(URL).read()) 
img = Image.open(file) 
+0

धन्यवाद [? कैसे स्थानीय रूप से उपयोग करते हुए अजगर जिसका URL पता मैं पहले से ही पता एक छवि को बचाने के लिए], होगा बस यह जोड़ना पसंद है कि एक ही सटीक कोड urllib2 (पायथन 2 के साथ) – sofly

+8

पायथन 3 में काम करेगा, यह स्ट्रिंगियो – matyas

27

उपयोग StringIO एक फ़ाइल की तरह वस्तु में पढ़ने स्ट्रिंग चालू करने के लिए:

from StringIO import StringIO 
import urllib 

Image.open(StringIO(urllib.urlopen(url).read())) 
49

मैं अनुरोध लाइब्रेरी का उपयोग का उपयोग कर की कोशिश कर सकते। ऐसा लगता है कि यह अधिक मजबूत है।

from PIL import Image 
import requests 
from StringIO import StringIO 

response = requests.get(url) 
img = Image.open(StringIO(response.content)) 
+3

के बजाय urllib.request आयात urlopen और io.io.BytesIO से होगा कुछ कारणों से urllib कुछ के लिए काम नहीं करता यूआरएल, लेकिन अनुरोधों ने काम किया जहां – mirri66

+0

मुझे पीआईएल पैकेज नहीं मिला, लेकिन ऐसा लगता है कि तकिया ने पीआईएल प्रयास पर कब्जा कर लिया है और आप पाइप 3 के लिए 'pip3.4 इंस्टॉल तकिया' के साथ स्थापित कर सकते हैं। – disruptive

+2

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

110

पायथन 3 में स्ट्रिंगियो और सीस्ट्रिंगियो मॉड्यूल चले गए हैं।

python3 में आप का उपयोग करना चाहिए:

from PIL import Image 
import requests 
from io import BytesIO 

response = requests.get(url) 
img = Image.open(BytesIO(response.content)) 
+15

मैं पिल्ललो का उपयोग कर रहा हूं https://pypi.python.org/pypi/Pillow/2.7.0 –

18
कुछ sklearn/numpy पोस्ट प्रोसेसिंग कर उन लोगों के लिए

(अर्थात दीप लर्निंग) आप np.array साथ जनहित याचिका वस्तु लपेट कर सकते हैं()। इस तरह मैंने किया था पर उसे Google होने से आप को बचा सकता है: संस्करण 2.8.0 से

from PIL import Image 
import requests 
import numpy as np 
from StringIO import StringIO 

response = requests.get(url) 
img = np.array(Image.open(StringIO(response.content))) 
18

आप में से जो लोग तकिया का उपयोग के लिए, आप कर सकते हैं:

from PIL import Image 
import urllib2 

im = Image.open(urllib2.urlopen(url)) 

या यदि आप requests का उपयोग करें:

from PIL import Image 
import requests 

im = Image.open(requests.get(url, stream=True).raw) 

संदर्भ:

संबंधित मुद्दे