web-dev-qa-db-ja.com

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

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

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

私が持っているものは次のとおりです。

Image.open(urlopen(url))

seek()が利用できないと不平を言っているので、私はこれを試しました:

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

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

139
Daniel Quinn

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

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

from PIL import Image
import requests
from io import BytesIO

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

あなたはStringIOを使用してみてください

import urllib, cStringIO

file = cStringIO.StringIO(urllib.urlopen(URL).read())
img = Image.open(file)
167
Fábio Diniz

要求ライブラリを使用します。より堅牢なようです。

from PIL import Image
import requests
from StringIO import StringIO

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

Pillowを使用している人は、バージョン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)

参照:

35

StringIOを使用して、読み取った文字列をファイルのようなオブジェクトに変換します。

from StringIO import StringIO
import urllib

Image.open(StringIO(urllib.requests.urlopen(url).read()))
27
Dan D.

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

Python 3

from urllib.request import urlopen
from PIL import Image

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

JupyterノートブックとIPython

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

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

10
Miladiouss

クロムで画像を選択して右クリックし、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()
2
Hamidreza

ほぼ間違いなくrecommended最近の画像入出力を行う方法は、専用パッケージ 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を支持

1
John Hennig