Python'daki bir URL'den görüntü verilerini nasıl okurum?


182

Yerel bir dosyayla uğraşırken yapmaya çalıştığım şey oldukça basit, ancak uzak bir URL ile yapmaya çalıştığımda sorun geliyor.

Temel olarak, bir URL'den çekilen bir dosyadan bir PIL görüntü nesnesi oluşturmaya çalışıyorum. Elbette, her zaman URL'yi alıp geçici bir dosyada saklayabilirim, sonra bir görüntü nesnesine açabilirim, ancak bu çok verimsiz geliyor.

İşte sahip olduğum şeyler:

Image.open(urlopen(url))

seek()Mevcut olmayan şikayet gevreği , bu yüzden sonra bunu denedim:

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

Ama bu da işe yaramadı. Bunu yapmanın daha iyi bir yolu var mı veya geçici bir dosyaya bu tür bir şey yapmanın kabul edilen yolu yazmak mı?


Yanıtlar:


282

Python3'te StringIO ve cStringIO modülleri gitti.

Python3'te şunları kullanmalısınız:

from PIL import Image
import requests
from io import BytesIO

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

Görüntüyü yanıttan nasıl geri alabilirim. İçerik?
Amresh Giri

requestspaketi bir URL'den resim alırken 503 durum kodu atar. Bunun yerine, http.clientgörüntüyü almak için başvurmak zorunda kaldım .
Manishankar Singh

Bunu denediğimde şunu elde ederim: AttributeError: modül 'istekleri' 'get' özniteliğine sahip değil.
apiljic

2
PIL> = 2.8.0 olduğundan BytesIO'da manuel olarak sarmaya artık gerek yoktur. Sadece kullan Image.open(response.raw). PIL bunu şimdi otomatik olarak kontrol eder ve kaputun altındaki BytesIO ambalajını yapar. Gönderen: pillow.readthedocs.io/en/3.0.x/releasenotes/2.8.0.html
Vinícius M

TEŞEKKÜR EDERİZUUUUUUUUUUU, OP.
Sharl Sherif

166

bir StringIO kullanmayı deneyebilirsiniz

import urllib, cStringIO

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

Teşekkürler, sadece aynı kodun urllib2 (Python2 ile) ile çalışacağını eklemek isterdim
sofly

17
python 3'te StringIO yerine urllib.request import urlopen ve io.io.BytesIO'dan olurdu
matyas

2
YARDIM, IOError: 0x7fb91b6a29b0> <_io.BytesIO nesnesi görüntü dosyasını tanımlayamıyor> URL'm: ... model = product.template & id = 16 & field = image_medium
С. Дэлгэрцэцэг

56

İstek kütüphanesini kullanıyorum. Daha sağlam görünüyor.

from PIL import Image
import requests
from StringIO import StringIO

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

3
Bir nedenden dolayı urllib bazı URL'ler için çalışmadı, ancak istekler başarısız olduğunda çalıştı
mirri66

PIL paketini bulamadım, ancak yastık PIL çabasını aldı ve python3 için kurabilirsiniz pip3.4 install pillow.
yıkıcı

3
İsteklerin tüm yanıtı belleğe yükleyeceğini ve ardından PIL'in tüm şeyi tekrar resim olarak yükleyeceğini unutmayın, böylece bellekte yerleşik iki tam kopyaya sahip olursunuz. Urllib yöntemini kullanarak önceki yanıt veri akışını sağlar, böylece yalnızca bir kopya artı akış arabellek boyutu elde edersiniz. Verileri isteklerle de aktarabilirsiniz, ancak yanıt read () anlambilimini desteklemediğinden bir bağdaştırıcı oluşturmanız gerekir.
sirdodger

@sirdodger urllib2 veya urllib'den mi bahsediyorsunuz?
CMCDragonkai

@CMCDragonkai Kabul edilen urllib cevabından bahsediyordum. Bellek yükü bir endişe ise, bu isteklerin yanıtını kullanmaktan daha iyidir. (Ancak, bahsettiğim gibi, istekleri kullanan farklı bir çözüm aynı etkiyi elde edebilir.)
sirdodger


27

StringIOOkuma dizesini dosya benzeri bir nesneye dönüştürmek için kullanın :

from StringIO import StringIO
import urllib

Image.open(StringIO(urllib.requests.urlopen(url).read()))

21

Bazı sklearn / numpy post işleme (yani Derin öğrenme) yapanlar için PIL nesnesini np.array () ile sarabilirsiniz. Bu, benim yaptığım gibi Google'a sahip olmanızı engelleyebilir:

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 Dizüstü Bilgisayar ve IPython

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

Diğer yöntemlerin aksine, bu yöntem bir for döngüsü içinde de çalışır!


12

Tartışmasız önerilen bu gün görüntü giriş / çıkış yapmanın yolu adanmış paket kullanmaktır ImageIO . Görüntü verileri basit bir kod satırı ile doğrudan bir URL'den okunabilir:

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

Bu sayfadaki birçok yanıt, bu paketin yayınlanmasından önce gelir ve bu nedenle bundan bahsetmez. ImageIO, Scikit-Image araç setinin bir bileşeni olarak başladı . Popüler görüntü işleme kütüphanesi PILlow tarafından sağlanan formatların üzerinde bir dizi bilimsel formatı destekler . Hepsini sadece görüntü giriş / çıkışına odaklanmış temiz bir API'ye sarar. Aslında, scipy kaldırıldı kendi görüntü okuyucu / yazar ImageIO lehine .


3

resmi kromda seçin, sağ tıklayın, tıklayın , resmi okumak için Copy image addressbir strdeğişkene ( my_url) yapıştırın :

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

aç onu;

from PIL import Image

img = Image.open('my_image.png')
img.show()
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.