1

次の Python コードを使用して、http ULR から JPG 画像を取得しようとしています (GUI に表示するため)。

import urllib3
from cStringIO import StringIO
from PIL import Image

conn = urllib3.connection_from_url('http://www.solarspace.co.uk/')
img_file = conn.urlopen('GET', 'http://www.solarspace.co.uk/PlanetPics/Neptune/NeptuneAlt1.jpg')
image = StringIO(img_file.read())
image.seek(0)
resized_image = Image.open(image)

ただし、これにより、「IOError: イメージ ファイルを識別できません」というエラー メッセージが表示されます。

私が urllib3 を使用している理由は、永続的な接続 (複数の要求を送信するため) が必要なためです。これは、urllib/urllib2 では利用できません。

前もって感謝します。

4

3 に答える 3

2

いつものrequestsように、救助のために:

>>> r = requests.get('http://www.solarspace.co.uk/PlanetPics/Neptune/NeptuneAlt1.jpg')
>>> i = Image.open(StringIO.StringIO(r.content))
>>> i.size
(262, 299)
于 2012-09-14T17:50:21.240 に答える
1

img_file.dataの代わりに使用すると機能するようですimg_file.read()。リクエストでimg_file.read()指定するときに使用することを意図しています。preload_content=False考えてみると、あまり直感的ではなくimg_file.read()、キャッシュされたプリロードされたコンテンツを認識する必要があるか、既に消費されている場合は例外を発生させる必要があります。計画はpreload_content=Falseデフォルトにすることでしたが、通常の使用法に当てはまり、満足するのが難しい多くのエッジケースがあることが判明しました。将来これを修正するためにバグを開きました: https://github.com/shazow/urllib3/issues/102

とにかく、使用img_file.dataすると問題が解決するはずです。混乱させて申し訳ありません!:)

またconn.request(...)、下位レベルの の代わりに を使用することをお勧めします。また、クロスドメインに移行する可能性がある場合はconn.urlopen(...)使用することをお勧めしPoolManagerます (実際に使用しない理由はありません)。これを試して:

>>> http = urllib3.PoolManager()
>>> r = http.request('GET', 'http://www.solarspace.co.uk/PlanetPics/Neptune/NeptuneAlt1.jpg')
>>> resized_image = Image.open(StringIO(r.data))
于 2012-09-14T18:13:27.617 に答える
0

保存すると、次のことができます。

with open('##.jpg','wb') as fout:
     fout.write(r.content)
于 2013-07-07T09:28:41.480 に答える