PythonでURLから画像データを読み取るにはどうすればよいですか?


182

ローカルファイルを処理する場合、私がやろうとしていることはかなり簡単ですが、リモートURLでこれを実行しようとすると問題が発生します。

基本的に、私はURLからプルされたファイルからPIL画像オブジェクトを作成しようとしています。もちろん、常にURLをフェッチして一時ファイルに保存し、それを画像オブジェクトに開くこともできますが、これは非常に非効率的です。

ここに私が持っているものがあります:

Image.open(urlopen(url))

それseek()は利用できないという不満をフレークアウトするので、私はこれを試しました:

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

しかし、それもうまくいきませんでした。これを行うためのより良い方法はありますか、またはこの種のことを行うための受け入れられた方法で一時ファイルに書き込みますか?


回答:


281

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

Python3では、次を使用する必要があります。

from PIL import Image
import requests
from io import BytesIO

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

response.contentから画像を取得するにはどうすればよいですか?
Amresh Giri、

requestsパッケージは、URLから画像をフェッチするときに503ステータスコードをスローします。代わりに、http.clientイメージを取得するために頼らなければなりませんでした。
Manishankar Singh

これを試してみると:AttributeError:module 'requests' has no attribute 'get'。
apiljic

2
PIL> = 2.8.0以降、BytesIOでの手動ラップは不要になりました。だけを使用してくださいImage.open(response.raw)。PILはその時点で自動的にそれをチェックし、内部でBytesIOラッピングを実行します。From:pillow.readthedocs.io/en/3.0.x/releasenotes/2.8.0.html
ヴィニシウスM

よろしくお願いします。
Sharl Sherif

166

あなたはStringIOを使用してみることができます

import urllib, cStringIO

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

おかげで、同じようにまったく同じコードが(Python2と)urllib2ので動作することを追加するだろう
sofly

17
Python 3では、StringIOではなくurllib.request import urlopenとio.io.BytesIOからのものになります
matyas

2
HELP、例外IOError:<0x7fb91b6a29b0で_io.BytesIOオブジェクト>イメージファイルを識別することはできません、私のURLは次のとおりです...モデル= product.template&ID = 16&フィールド= image_medium
С. Дэлгэрцэцэг18年

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

PILパッケージを見つけることができませんでしたが、枕がPILの作業を引き継いだようで、Python3をでインストールできますpip3.4 install pillow
2015年

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

@sirdodger urllib2またはurllibを参照していますか?
CMCDragonkai 2018年

@CMCDragonkai私は承認されたurllib回答を参照していました。メモリのオーバーヘッドが懸念される場合は、このリクエストの回答を使用するよりも優れています。(ただし、前述したように、リクエストを使用した別のソリューションでも同じ効果が得られます。)
sirdodger '29


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

Python 3

from urllib.request import urlopen
from PIL import Image

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

Jupyter NotebookとIPython

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

他のメソッドとは異なり、このメソッドはforループでも機能します!


12

最近のイメージの入出力を行うために間違いなく推奨される方法は、専用パッケージImageIOを使用することです。画像データは、次の1行のコードでURLから直接読み取ることができます。

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

このページの多くの回答は、そのパッケージのリリース以前のものであるため、言及していません。ImageIOは、Scikit-Imageツールキットのコンポーネントとして始まりました。それは人気のある画像処理ライブラリPILlowによって提供されるものに加えて、いくつかの科学的フォーマットをサポートします。画像の入出力のみに焦点を当てたクリーンなAPIですべてをラップします。実際、SciPy は独自のイメージリーダー/ライター削除、ImageIOを採用しました


3

クロムで画像を選択し、右クリックしてをクリックしCopy image addressstr変数(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()
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.