Coverage for image_utils.py: 100%
31 statements
« prev ^ index » next coverage.py v7.15.4, created at 2026-08-09 04:47 +0000
« prev ^ index » next coverage.py v7.15.4, created at 2026-08-09 04:47 +0000
1from typing import Optional
3from io import BytesIO
5from PIL import Image
7from file_utils import binary_to_base64
8from file_utils import base64_to_binary
11def img_to_base64(image: Optional[Image.Image]) -> Optional[str]:
12 if image is None:
13 return None
14 if not isinstance(image, Image.Image):
15 raise TypeError(f"Expected Image.Image for image, got {type(image)}")
16 image_buffer = BytesIO()
17 image.save(image_buffer, format="PNG")
18 image_bytes = image_buffer.getvalue()
19 image_base64 = binary_to_base64(image_bytes)
20 return image_base64
23def img_to_bytesio(image: Optional[Image.Image]) -> Optional[BytesIO]:
24 if image is None:
25 return None
26 if not isinstance(image, Image.Image):
27 raise TypeError(f"Expected Image.Image for image, got {type(image)}")
28 image_buffer = BytesIO()
29 image.save(image_buffer, format="PNG")
30 image_buffer.seek(0)
31 return image_buffer
34def base64_to_img(image_base64: str) -> Image.Image:
35 """Converts a base64-encoded string to a PIL Image object."""
36 if not isinstance(image_base64, str):
37 raise TypeError(f"Expected str for image_base64, got {type(image_base64)}")
38 image_bytes = base64_to_binary(image_base64)
39 image_buffer = BytesIO(image_bytes)
40 image = Image.open(image_buffer).convert("RGB")
41 return image