2011-09-12 13 views
107

To, co próbuję zrobić, jest dość proste, gdy mamy do czynienia z plikiem lokalnym, ale problem pojawia się, gdy próbuję to zrobić ze zdalnym adresem URL.Jak mogę odczytać dane obrazu z adresu URL w Pythonie?

Zasadniczo próbuję utworzyć obiekt obrazu PIL z pliku wyciągniętego z adresu URL. Oczywiście, zawsze mogę po prostu pobrać adres URL i zapisać go w pliku tymczasowym, a następnie otworzyć go w obiekcie obrazu, ale to wydaje się bardzo nieefektywne.

Oto co mam:

Image.open(urlopen(url)) 

It Out płatki skarży że seek() nie jest dostępny, więc potem próbowałem to:

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

Ale to nie działało. Czy istnieje lepsza droga, aby to zrobić, czy też zapisuje do pliku tymczasowego akceptowany sposób robienia tego rodzaju rzeczy?

+0

Zobacz także: [Jak zapisać obraz lokalnie przy użyciu Pythona, której adres URL już wiem?] (Http://stackoverflow.com/q/8286352/562769) –

Odpowiedz

145

można spróbować użyć StringIO

import urllib, cStringIO 

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

Dzięki, by tak jak dodać, że ten sam dokładny kod będzie działał z urllib2 (z Python2) – sofly

+8

w pythonie 3 to byłoby z urllib.request importować urlopen i io.io.BytesIO zamiast StringIO – matyas

27

Zastosowanie StringIO obrócić ciąg odczytu do obiektu plikopodobny:

from StringIO import StringIO 
import urllib 

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

używam biblioteki żądań. Wydaje się być bardziej solidny.

from PIL import Image 
import requests 
from StringIO import StringIO 

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

Z jakiegoś powodu urllib nie działał dla niektórych Adresy URL, ale żądania zadziałały tam, gdzie to się nie udało – mirri66

+0

Nie mogłem znaleźć pakietu PIL, ale wygląda na to, że poduszka przejęła wysiłek PIL i możesz zainstalować dla python3 z 'pip3.4 install pillow'. – disruptive

+2

Należy pamiętać, że żądania będą ładować całą odpowiedź do pamięci, a następnie PIL załaduje całą rzecz ponownie jako obraz, więc masz dwie pełne kopie rezydentne w pamięci. Poprzednia odpowiedź za pomocą metody urllib przesyła dane, więc kończy się tylko jedna kopia plus rozmiar bufora strumieniowego. Możesz przesyłać strumieniowo dane również za pomocą żądań, ale ponieważ odpowiedź nie obsługuje semantyki read(), musisz zbudować adapter. – sirdodger

110

W Pythonie 3 moduły StringIO i cStringIO zniknęły.

W Python3 należy użyć:

from PIL import Image 
import requests 
from io import BytesIO 

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

Używam Pilllow https://pypi.python.org/pypi/Pillow/2.7.0 –

18

Dla tych jakiejś sklearn/numpy przetwarzanie post (tj Głębokie learning) można owinąć obiektu PIL z np.array(). To może zaoszczędzić od konieczności Google to tak jak ja:

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))) 
Powiązane problemy