파이썬의 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.