Python

이미지를 BLOB으로 DB에 저장, 불러오기

eunyeon 2023. 11. 27. 16:56

이번 포스트에서는 이미지를 BLOB 형태로 DB에 저장 후, 다시 불러와서 image로 출력해보기를 진행하겠습니다.

코드는 Python으로 작성하였으며, DB는 MongoDB를 사용하였습니다.

 

 

우선 MongoDB Compass를 실행 후 localhost:27017로 Connect 하겠습니다.

 

MongDB Compass 실행

 

 

Connect 후 demodatabase라는 client 생성 후 그 안에 BLOB_image라는 Collection을 생성하였습니다.

 

demodatabase-BLOB_image

 

 

여기까지 간단하게 DB 세팅은 끝났습니다. 다음은 DB에 이미지를 BLOB형태로 전송하는 코드를 보겠습니다.

python 코드파일과 같은 경로에 test_image.jpg를 저장한 다음 아래와 같이 코드를 실행하겠습니다.

코드를 실행하려면 pymongo와 gridfs 라이브러리는 설치해야 합니다.

 

from pymongo import MongoClient
from gridfs import GridFS

# MongoDB에 연결
client = MongoClient('localhost', 27017)
db = client['demodatabase']

# 특정 컬렉션에 GridFS 생성
fs = GridFS(db, collection='BLOB_image')

#  저장할 파일 열기 (바이너리 모드로)
with open('./이미지파일명', 'rb') as file:
# 파일 데이터를 GridFS에 저장
    stored = fs.put(file, filename='파일명')
print("파일 ID:", stored)

 

 

정상적으로 실행되셨다면 아래와 같이 실행 터미널에서 파일 ID를 확인 할 수 있습니다.

 

 

 

MongoDB에서도 같은 id의 데이터가 저장되었음을 확인 할 수 있습니다.

저는 위 코드에서 BLOB_image라는 collection에 저장되게 작성하였는데 실제로 MongoDB를 확인해보면 BLOB_image.chunks 와 BLOB_image.files 에 BLOB 데이터와 file 정보가 추가 되었음을 확인 할 수 있습니다.

 

BLOB_image.files: filename, length, uploadDate 등의 데이터의 정보 저장

BLOB_image.chunks:  Base64 형태의 실제 BLOB 데이터가 저장

 

BLOB_image.files

 

 

 

 

BLOB_image.chunks

 

 

이번에는 반대로 DB에 저장된 BLOB 데이터를 Python으로 불러온 후 이미지 출력을 해보겠습니다.

BLOB 데이터를 저장 할 때 확인하였던 ID로 데이터를 찾아 불러오겠습니다.

여기서 주의할 점은 BLOB 데이터의 경우 _id: 에 id가 ObjectId로 감싸져 있습니다.

때문에 id만 입력해서는 데이터를 불러올 수가 없으며, BLOB의 _id: 와 같이 ObjectId()를 사용하여야만 id로 BLOB 데이터를 불러 올 수 있습니다.

 

from pymongo import MongoClient
from gridfs import GridFS
import cv2
import numpy as np
from bson import ObjectId

# MongoDB에 연결
client = MongoClient('localhost', 27017)
db = client['demodatabase']
fs = GridFS(db, collection='BLOB_image')

# 이미지를 불러올 파일 ID 선택
file_id = "BLOB 데이터 ID"

# 파일 ID를 사용하여 BLOB 이미지 불러오기
file_data = fs.get(ObjectId(file_id))

image_bytes = file_data.read()

# 바이트 데이터를 numpy 배열로 변환
nparr = np.frombuffer(image_bytes, np.uint8)

# OpenCV를 사용하여 이미지로 디코딩
image = cv2.imdecode(nparr, cv2.IMREAD_COLOR)

if image is not None and image.size > 0:
    # 이미지 출력
    cv2.imshow('Loaded Image', image)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
else:
    print("이미지를 불러올 수 없습니다.")

 

 

 

 

고양이 사진을 예시로 실행한 코드 실행 결과입니다.

정상적으로 불러온 후 출력됨을 확인할 수 있습니다.

 

 

 

여기까지해서 BLOB 데이터를 간단하게 저장하고 불러오는 것까지 해보았습니다.

이미지 저장이 필요하다면 DB에 BLOB으로 저장하는 것보다 클라우드에 이미지 파일로 직접 저장하는 것이 효율적이겠지만, 간단한 BLOB 데이터 저장이 필요한 경우엔 글 내용을 참고해주시길 바랍니다.