私がやろうとしていることは、ローカルファイルを扱う場合はかなり単純ですが、リモートURLでこれをしようとすると問題が生じます。
基本的に、URLから取得したファイルからPILイメージオブジェクトを作成しようとしています。もちろん、URLを取得して一時ファイルに保存し、それを画像オブジェクトで開くことはできますが、それは非常に非効率的です。
私が持っているものは次のとおりです。
Image.open(urlopen(url))
seek()
が利用できないと不平を言っているので、私はこれを試しました:
Image.open(urlopen(url).read())
しかし、それもうまくいきませんでした。これを行うためのより良い方法はありますか、または一時ファイルにこの種のことを行うための受け入れられた方法に書き込むのですか?
Python3では、StringIOおよびcStringIOモジュールはなくなりました。
Python3では、次を使用する必要があります。
from PIL import Image
import requests
from io import BytesIO
response = requests.get(url)
img = Image.open(BytesIO(response.content))
あなたはStringIOを使用してみてください
import urllib, cStringIO
file = cStringIO.StringIO(urllib.urlopen(URL).read())
img = Image.open(file)
要求ライブラリを使用します。より堅牢なようです。
from PIL import Image
import requests
from StringIO import StringIO
response = requests.get(url)
img = Image.open(StringIO(response.content))
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)
参照:
StringIO
を使用して、読み取った文字列をファイルのようなオブジェクトに変換します。
from StringIO import StringIO
import urllib
Image.open(StringIO(urllib.requests.urlopen(url).read()))
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)))
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)
他のメソッドとは異なり、このメソッドはforループでも機能します!
クロムで画像を選択して右クリックし、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()
ほぼ間違いなく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を支持 。