27

インターネットで画像の寸法を知りたいです。使ってみた

from PIL import Image
import urllib2 as urllib
fd = urllib.urlopen("http://a/b/c")
im = Image.open(fd)
im.size

この回答で示唆されているように、しかしエラーメッセージが表示されます

addinfourl instance has no attribute 'seek'

調べたところ、 から返されたオブジェクトにはurllib2.urlopen(url)、 によると、シーク メソッドがないようですdir

では、インターネットから PIL に画像をロードできるようにするには、どうすればよいでしょうか?

4

7 に答える 7

43

前方互換性io.BytesIOのために使用することを検討してください。 StringIO および cStringIO モジュールは Python 3 には存在しません。

from PIL import Image
import urllib2 as urllib
import io

fd = urllib.urlopen("http://a/b/c")
image_file = io.BytesIO(fd.read())
im = Image.open(image_file)
于 2012-08-18T17:46:37.137 に答える
12

Python の使用requests:

from PIL import Image
from StringIO import StringIO
import requests

r = requests.get("http://a/b/c")
im = Image.open(StringIO(r.content))
im.size
于 2014-08-17T15:53:23.547 に答える
8

このプルリクエストは、Pillow (フレンドリーな PIL フォーク) にネイティブなストリーム処理のサポートを追加し、バージョン 2.8.0 から利用できるはずです。これにより、 urllibを使用してリモート ファイルを簡単に開くことができます。

from PIL import Image
import urllib2
Image.open(urllib2.urlopen(url))

...またはリクエストを使用する:

from PIL import Image
import requests
Image.open(requests.get(url, stream=True).raw)

PR リクエストで mjpieters が述べたように、レスポンスは自動的にデコードされgzipないため、何らかの理由でさらに圧縮された画像をダウンロードする場合は、decode_content=Trueアクセスする前にレスポンス オブジェクトを設定する必要があります.raw

response = requests.get(url, stream=True)
response.raw.decode_content = True
image = Image.open(response.raw)
于 2015-03-29T10:31:15.277 に答える
8

同じ例を使用して、 StringIO を使用して、バッファーを適切なファイルのようなオブジェクトにラップします。

from PIL import Image
import urllib2 as urllib
from StringIO import StringIO

fd = urllib.urlopen("http://a/b/c")
im = Image.open(StringIO(fd.read()))
im.size
于 2012-08-18T17:47:35.717 に答える
2

urllibドキュメントには、によって返されたオブジェクトが操作urlopenをサポートしていないことが記載されていseekます。

このモジュールは、ワールド ワイド ウェブ全体でデータを取得するための高レベル インターフェイスを提供します。特に、urlopen() 関数は組み込み関数 open() に似ていますが、ファイル名の代わりに Universal Resource Locator (URL) を受け入れます。いくつかの制限が適用されます — 読み取り用に URL を開くことしかできず、シーク操作は使用できません。

ただし、PIL.open関数は明示的にそれを必要とします。

開いた

Image.open(infile) => 画像

Image.open(ファイル内、モード) => 画像

指定された画像ファイルを開いて識別します。これは遅延操作です。実際の画像データは、データを処理しようとするまでファイルから読み取られません (load メソッドを呼び出して強制的に読み込みます)。モード引数を指定する場合、それは "r" でなければなりません。

文字列 (ファイル名を表す) またはファイル オブジェクトのいずれかを使用できます。後者の場合、ファイル オブジェクトは read、seek、および tell メソッドを実装し、バイナリ モードで開く必要があります。

cStringIO文字列をファイルのようなオブジェクトに変換するモジュールを使用してみてください。

from PIL import Image
import urllib2 as urllib
import cStringIO

fd = urllib.urlopen("http://a/b/c")
image_file = cStringIO.StringIO(fd.read())
im = Image.open(image_file)
im.size
于 2012-08-18T17:37:23.557 に答える
0

この回答は 4 年前のものですが、Google ではまだ上位にあります。Python3 では、簡単な解決策があります。

from urllib.request import urlopen
img =Image.open(urlopen('http://dl.iplaypython.com/images/banner336x280.jpg'))
new_img =img.resize((300,500),Image.ANTIALIAS)
new_img.save('url.jpg','jpeg')
于 2017-01-12T08:45:10.063 に答える