मैं पायथन में एक URL से छवि डेटा कैसे पढ़ सकता हूं?


180

जब हम एक स्थानीय फ़ाइल के साथ काम कर रहे होते हैं तो मैं काफी सरल होता हूं, लेकिन समस्या तब आती है जब मैं दूरस्थ URL के साथ ऐसा करने की कोशिश करता हूं।

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

यहाँ मेरे पास क्या है:

Image.open(urlopen(url))

यह शिकायत करता seek()है कि उपलब्ध नहीं है, तो मैंने यह कोशिश की:

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

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


जवाबों:


279

Python3 में StringIO और cStringIO मॉड्यूल गए हैं।

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

from PIL import Image
import requests
from io import BytesIO

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

प्रतिक्रिया से छवि कैसे प्राप्त करें। महाद्वीप?
अमरेश गिरी

requestsपैकेज एक URL से एक छवि प्राप्त करते समय 503 स्थिति कोड फेंकता है। इसके बजाय, मुझे http.clientछवि प्राप्त करने के लिए सहारा लेना पड़ा ।
मणिशंकर सिंह

जब मैं इसकी कोशिश करता हूं तो मुझे यह मिलता है: विशेषता: मॉड्यूल: 'अनुरोध' में कोई विशेषता नहीं है।
अपोजिक

2
बाइट्सियो में मैन्युअल रूप से लपेटने की अब पीआईएल> = 2.8.0 के बाद से जरूरत नहीं है। बस उपयोग करें Image.open(response.raw)। पीआईएल स्वचालित रूप से अब के लिए जाँच करता है और बाइट्सियो को हुड के नीचे लपेटता है। प्रेषक: तकिए ।readthedocs.io
एम

धन्यवाद YouUUUUUUUUUU, ओपी।
Sharl शरीफ

166

आप एक स्ट्रिंग का उपयोग करने की कोशिश कर सकते हैं

import urllib, cStringIO

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

धन्यवाद, बस इतना जोड़ना चाहूंगा कि एक ही सटीक कोड urllib2 (Python2 के साथ) के साथ काम करेगा
18

17
अजगर 3 में यह urllib.request आयात urlopen और io.io.BytesIO से होगा बजाय StringIO
matyas

2
HELP, IOError: छवि फ़ाइल की पहचान नहीं कर सकता <_io.BytesIO ऑब्जेक्ट पर 0x7fb91b6a29b0> मेरा url है: ... मॉडल = product.template & id = 16 & field = image -medium
С. Длг

56

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

from PIL import Image
import requests
from StringIO import StringIO

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

3
किसी कारण से urllib ने कुछ URL के लिए काम नहीं किया, लेकिन अनुरोधों ने जहां काम किया वह विफल रहा
mirri66

मुझे पीआईएल पैकेज नहीं मिला, लेकिन ऐसा लगता है कि तकिया ने पीआईएल प्रयास को संभाल लिया है और आप python3 के साथ स्थापित कर सकते हैं pip3.4 install pillow
विघटनकारी

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

@sirdodger क्या आप urllib2 या urllib का जिक्र कर रहे हैं?
CMCDragonkai

@CMCDragonkai मैं स्वीकार किए गए urllib उत्तर का उल्लेख कर रहा था। यदि मेमोरी ओवरहेड एक चिंता का विषय है, तो इस अनुरोध के उत्तर का उपयोग करने से बेहतर है। (हालांकि, जैसा मैंने उल्लेख किया है, अनुरोधों का उपयोग करने वाला एक अलग समाधान एक ही प्रभाव प्राप्त कर सकता है।)
सिरोडर

42

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

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)

संदर्भ:


27

StringIOरीड स्ट्रिंग को फ़ाइल जैसी ऑब्जेक्ट में बदलने के लिए उपयोग करें :

from StringIO import StringIO
import urllib

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

21

कुछ sklearn / numpy पोस्ट प्रोसेसिंग (यानी डीप लर्निंग) करने वालों के लिए आप np.array () के साथ PIL ऑब्जेक्ट को लपेट सकते हैं। हो सकता है कि यह आपको Google से बचाए जैसा मैंने किया था:

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)))

19

अजगर ३

from urllib.request import urlopen
from PIL import Image

img = Image.open(urlopen(url))
img

ज्यूपिटर नोटबुक और आईपीथॉन

import IPython
url = 'https://newevolutiondesigns.com/images/freebies/colorful-background-14.jpg'
IPython.display.Image(url, width = 250)

अन्य विधियों के विपरीत, यह विधि लूप के लिए भी काम करती है!


12

इन दिनों छवि इनपुट / आउटपुट करने के लिए यकीनन अनुशंसित तरीका समर्पित पैकेज इमेजियो का उपयोग करना है । छवि डेटा को कोड की एक सरल रेखा के साथ सीधे URL से पढ़ा जा सकता है:

from imageio import imread
image = imread('https://cdn.sstatic.net/Sites/stackoverflow/img/logo.png')

इस पृष्ठ पर कई उत्तर उस पैकेज के जारी होने से पहले के हैं और इसलिए इसका उल्लेख नहीं करते हैं। ImageIO ने स्किट-इमेज टूलकिट के घटक के रूप में शुरू किया । यह लोकप्रिय इमेज-प्रोसेसिंग लाइब्रेरी PILlow द्वारा उपलब्ध कराए गए शीर्ष पर कई वैज्ञानिक स्वरूपों का समर्थन करता है । यह पूरी तरह से छवि इनपुट / आउटपुट पर केंद्रित एक साफ एपीआई में लपेटता है। वास्तव में, SciPy ने ImageIO के पक्ष में अपने स्वयं के छवि पाठक / लेखक को हटा दिया


3

क्रोम में छवि का चयन करें, उस पर राइट क्लिक करें, क्लिक करें Copy image address, इसे एक strचर में पेस्ट करें ( my_url) छवि को पढ़ने के लिए:

import shutil
import requests

my_url = 'https://www.washingtonian.com/wp-content/uploads/2017/06/6-30-17-goat-yoga-congressional-cemetery-1-994x559.jpg'
response = requests.get(my_url, stream=True)
with open('my_image.png', 'wb') as file:
    shutil.copyfileobj(response.raw, file)
del response

खोलो इसे;

from PIL import Image

img = Image.open('my_image.png')
img.show()
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.