2011-09-12 19 views
107

私がしようとしているのは、ローカルファイルを扱うときにかなり簡単ですが、リモートURLでこれをしようとすると問題が発生します。PythonのURLから画像データを読み取るにはどうすればよいですか?

基本的には、URLから取得したファイルからPILイメージオブジェクトを作成しようとしています。確かに、URLを取り出して一時ファイルに保存してイメージオブジェクトに開くことはできますが、それは非常に非効率的です。

は、ここで私が持っているものです。

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

をしかし、それはどちらか動作しませんでした:

Image.open(urlopen(url)) 

それフレークうちはそう、私はこれを試してみました、seek()が利用できないことに文句。これを行うための良い方法があるのですか、または一時的なファイルにこのようなことを行うための受け入れられた方法を書いていますか?ファイルのようなオブジェクトに読み出した文字列をオンにする

+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アドレス私はすでに知っているのPythonを使ってローカルで画像を保存するには?]ちょうど同じ正確なコードがpython 3でurllib2(Python2で) – sofly

+8

で動作することを追加するのと同じように、urllib.requestからインポートされます。StringIOの代わりにurlopenとio.io.BytesIOをインポートします – 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がURLは、要求が失敗したところで働いた – mirri66

+0

私はPILパッケージを見つけることができませんでしたが、PILの努力を引き継いだ枕のようで、 'pip3.4 install pillow'でpython3のためにインストールできます。 – disruptive

+2

要求はメモリ全体に応答をロードし、PILはイメージとして全体を再度ロードするので、メモリに常駐する2つの完全なコピーが存在することに注意してください。 urllibメソッドを使用した以前の回答ではデータがストリーミングされていたので、1つのコピーとストリーミングバッファサイズを加えたものにすぎません。リクエストでもデータをストリーミングできますが、レスポンスはread()セマンティクスをサポートしていないため、アダプタを構築する必要があります。 – sirdodger

110

Python3では、StringIOモジュールとcStringIOモジュールはなくなりました。

のpython3では、あなたが使用する必要があります:いくつかのsklearn/numpyの後処理を行う人のために

from PIL import Image 
import requests 
from io import BytesIO 

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

私はPilllow https://pypi.python.org/pypi/Pillow/2.7.0を使用しています –

18

(すなわち、ディープ学習を)あなたは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))) 
関連する問題