파이썬의 URL에서 이미지 데이터를 어떻게 읽습니까?


182

내가하려고하는 것은 로컬 파일을 처리 할 때 상당히 간단하지만 원격 URL 로이 작업을 수행하려고하면 문제가 발생합니다.

기본적으로 URL에서 가져온 파일에서 PIL 이미지 객체를 만들려고합니다. 물론 항상 URL을 가져 와서 임시 파일에 저장 한 다음 이미지 객체로 열 수는 있지만 매우 비효율적입니다.

내가 가진 것은 다음과 같습니다.

Image.open(urlopen(url))

seek()사용할 수 없다는 불평이 나기 때문에 이것을 시도했습니다.

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

그러나 그것은 작동하지 않았습니다. 이 작업을 수행하는 더 좋은 방법이 있습니까, 아니면 이런 종류의 작업을 허용하는 방법으로 임시 파일에 쓰는 중입니까?


답변:


281

Python3에서는 StringIO 및 cStringIO 모듈이 사라졌습니다.

Python3에서는 다음을 사용해야합니다.

from PIL import Image
import requests
from io import BytesIO

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

response.content에서 이미지를 다시 얻는 방법은 무엇입니까?
Amresh Giri

requestsURL에서 이미지를 가져 오는 동안 package에서 503 상태 코드가 발생합니다. 대신 http.client이미지를 얻기 위해 의지해야 했습니다.
Manishankar Singh

이것을 시도하면 다음과 같은 결과가 나타납니다. AttributeError : 모듈 '요청'에 'get'속성이 없습니다.
apiljic

2
PIL> = 2.8.0이므로 BytesIO에서 수동 줄 바꿈이 더 이상 필요하지 않습니다. 그냥 사용하십시오 Image.open(response.raw). PIL은 이제 자동으로이를 확인하고 후드 아래에서 BytesIO 래핑을 수행합니다. 출처
Vinícius M

YOUUUUUUUUUUUUU, OP. 감사합니다.
Sharl Sherif

166

StringIO를 사용해보십시오.

import urllib, cStringIO

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

덕분처럼 똑같은 코드 (Python2 포함) urllib2가 맞는지 추가하는 것
sofly

17
파이썬 3에서는 StringIO 대신 urllib.request import urlopen 및 io.io.BytesIO에서 온 것입니다
matyas

2
도움말, IOError : 이미지 파일 <_io.BytesIO object at 0x7fb91b6a29b0>을 (를) 식별 할 수 없습니다. 내 URL은 ... model = product.template & id = 16 & field = image_medium
С입니다. Дэлгэрцэцэг

56

요청 라이브러리를 사용합니다. 더 강력 해 보입니다.

from PIL import Image
import requests
from StringIO import StringIO

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

3
어떤 이유로 urllib는 일부 URL에서는 작동하지 않지만 요청은 실패한 위치에서 작동했습니다.
mirri66 8

PIL 패키지를 찾을 수 없지만 베개가 PIL 노력을 인계 한 것으로 보이며 python3을 설치하여 설치할 수 있습니다 pip3.4 install pillow.
파괴적인

3
요청은 전체 응답을 메모리에로드 한 다음 PIL이 전체를 이미지로 다시로드하므로 두 개의 전체 사본이 메모리에 상주합니다. urllib 메소드를 사용하는 이전 답변은 데이터를 스트리밍하므로 하나의 사본과 스트리밍 버퍼 크기로 끝납니다. 요청으로 데이터를 스트리밍 할 수도 있지만 응답이 read () 의미를 지원하지 않기 때문에 어댑터를 빌드해야합니다.
sirdodger

@sirdodger urllib2 또는 urllib를 참조하고 있습니까?
CMCDragonkai

@CMCDragonkai 나는 받아 들인 urllib 답변을 언급하고있었습니다. 메모리 오버 헤드가 우려되는 경우이 요청 응답을 사용하는 것보다 낫습니다. (그러나 언급 한 바와 같이 요청을 사용하는 다른 솔루션도 동일한 효과를 얻을 수 있습니다.)
sirdodger


27

StringIO읽은 문자열을 파일과 같은 객체로 바꾸려면 사용하십시오 .

from StringIO import StringIO
import urllib

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

21

sklearn / numpy 사후 처리 (즉, 딥 러닝)를 수행하는 경우 PIL 객체를 np.array ()로 래핑 할 수 있습니다. 이렇게하면 내가했던 것처럼 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)))

19

파이썬 3

from urllib.request import urlopen
from PIL import Image

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

Jupyter Notebook 및 IPython

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

다른 방법과 달리이 방법은 for 루프에서도 작동합니다!


12

틀림없이 권장 요즘 이미지 입력 / 출력을 할 수있는 방법은 전용 패키지 사용하는 것입니다 ImageIO에서를 . 간단한 한 줄의 코드로 URL에서 이미지 데이터를 직접 읽을 수 있습니다.

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

이 페이지의 많은 답변이 해당 패키지의 출시 이전에 있으므로 언급하지 않았습니다. ImageIO는 Scikit-Image 툴킷의 구성 요소로 시작되었습니다 . 널리 사용되는 이미지 처리 라이브러리 인 PILlow 에서 제공하는 형식 외에 다양한 과학 형식을 지원합니다 . 이미지 입 / 출력에만 초점을 맞춘 깨끗한 API로 모든 것을 감싸줍니다. 실제로 SciPy 는 ImageIO를 위해 자체 이미지 리더 / 라이터 제거 했습니다 .


3

크롬에서 이미지를 선택하고 마우스 오른쪽 버튼으로 클릭 한 다음를 클릭 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()
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.