Coverage for image_utils.py: 100%

31 statements  

« prev     ^ index     » next       coverage.py v7.15.4, created at 2026-08-09 04:47 +0000

1from typing import Optional 

2 

3from io import BytesIO 

4 

5from PIL import Image 

6 

7from file_utils import binary_to_base64 

8from file_utils import base64_to_binary 

9 

10 

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 

21 

22 

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 

32 

33 

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