From 4f7e8150e9108ba7967f02d2021e4ae5da8226f8 Mon Sep 17 00:00:00 2001 From: Brian Bjarke Jensen Date: Sat, 13 Jul 2024 23:30:22 +0200 Subject: [PATCH] added image specific io functions --- shared/data_store/get_image.py | 39 ++++++++++++++++++++++++++++++ shared/data_store/put_image.py | 44 ++++++++++++++++++++++++++++++++++ 2 files changed, 83 insertions(+) create mode 100644 shared/data_store/get_image.py create mode 100644 shared/data_store/put_image.py diff --git a/shared/data_store/get_image.py b/shared/data_store/get_image.py new file mode 100644 index 0000000..0459aab --- /dev/null +++ b/shared/data_store/get_image.py @@ -0,0 +1,39 @@ +"""Definition of get_image function.""" + +import logging +import os +from io import BytesIO + +from minio import Minio +from PIL import Image + + +def get_image( + client: Minio, + object_name: str, +) -> Image.Image: + """Get image from image subfolder in bucket in Minio.""" + assert isinstance(client, Minio) + assert isinstance(object_name, str) + # prepare arguments + bucket_name = os.getenv('MINIO_BUCKET_NAME') + subfolder = 'images' + # get object from bucket + object_name = f'{subfolder}/{object_name}' + try: + response = client.get_object( + bucket_name=bucket_name, + object_name=object_name, + ) + buffer = BytesIO(response.data) + except Exception as exc: + logging.error('failed getting data from MinIO') + raise exc + finally: + response.close() + response.release_conn() + buffer.seek(0) + # convert data to image + image = Image.open(buffer) + logging.debug('got data from %s', object_name) + return image diff --git a/shared/data_store/put_image.py b/shared/data_store/put_image.py new file mode 100644 index 0000000..4bdab4c --- /dev/null +++ b/shared/data_store/put_image.py @@ -0,0 +1,44 @@ +"""Definition of put_image function.""" + +import logging +import os +from hashlib import md5 +from io import BytesIO + +from minio import Minio +from PIL import Image + + +def put_image( + client: Minio, + image: Image.Image, +) -> str: + """Put image in image subfolder in bucket in Minio and return MD5 checksum + used as object name.""" + assert isinstance(client, Minio) + assert isinstance(image, Image.Image) + bucket_name = os.getenv('MINIO_BUCKET_NAME', default=None) + assert isinstance(bucket_name, str) + subfolder = 'images' + # save image to buffer + buffer = BytesIO() + image.save(buffer, 'png') + # get md5 of image + checksum = md5(buffer.getbuffer()).hexdigest() + # prepare for saving + num_bytes = buffer.tell() + buffer.seek(0) + # send data to bucket + object_name = f'{subfolder}/{checksum}' + try: + client.put_object( + bucket_name=bucket_name, + object_name=object_name, + length=num_bytes, + data=buffer, + ) + except Exception as exc: + logging.error('failed saving data to MinIO') + raise exc + logging.debug('saved data to %s', object_name) + return checksum