FastAPI 이미지 전달 기능 만들기

pillow 이미지 객체를 bytes 형식으로 변환하고, base64를 이용해 인코딩 및 디코딩하는 과정을 거치면 API를 통해 여러 이미지 데이터를 리스트에 담아 보낼 수 있다.

from fastapi import APIRouter
from fastapi.responses import JSONResponse
from PIL import Image
import requests
import base64
import io

router = APIRouter()

def from_image_to_bytes(img):
    """
    pillow image 객체를 bytes로 변환
    """
    # Pillow 이미지 객체를 Bytes로 변환
    imgByteArr = io.BytesIO()
    img.save(imgByteArr, format=img.format)
    imgByteArr = imgByteArr.getvalue()
    # Base64로 Bytes를 인코딩
    encoded = base64.b64encode(imgByteArr)
    # Base64로 ascii로 디코딩
    decoded = encoded.decode('ascii')
    return decoded

@router.get("/image/")
async def func():
    # 이미지 주소
    img_url = "https://dimg.donga.com/ugc/CDB/WEEKLY/Article/5b/b3/22/85/5bb32285000ed2738de6.jpg"
    # 이미지 불러오기
    img = Image.open(requests.get(img_url, stream=True).raw)
    # 이미지 데이터 타입 변환
    img_converted = from_image_to_bytes(img)
    # 이미지 리스트 생성
    img_list = [img_converted, img_converted]
    return JSONResponse(img_list)


이미지 요청하기

주피터 노트북을 열고 아래와 같이 이미지를 요청해본다.

import io
import base64
import requests
from PIL import Image

# FastAPI URL
url = "http://localhost:5000/image"
# 요청
result = requests.get(url)
# 딕셔너리 변환
res = json.loads(result.content)
# 이미지 Bytes 리스트
bytes_list = list(map(lambda x: base64.b64decode(x), res))
# 이미지 Pillow Image 리스트
image_list = list(map(lambda x: Image.open(io.BytesIO(x)), bytes_list))
image_list[0]

PNG

태그:

카테고리:

업데이트:

댓글남기기