Commit adeef56b authored by narugo1992's avatar narugo1992
Browse files

dev(narugo): add add_background_for_rgba function

parent 5dfe589b
Loading
Loading
Loading
Loading
+16 −2
Original line number Diff line number Diff line
from os import PathLike
from typing import Union, BinaryIO, List, Tuple
from typing import Union, BinaryIO, List, Tuple, Optional

from PIL import Image

__all__ = [
    'ImageTyping', 'load_image',
    'MultiImagesTyping', 'load_images',
    'add_background_for_rgba',
]


@@ -17,7 +18,7 @@ ImageTyping = Union[str, PathLike, bytes, bytearray, BinaryIO, Image.Image]
MultiImagesTyping = Union[ImageTyping, List[ImageTyping], Tuple[ImageTyping, ...]]


def load_image(image: ImageTyping, mode=None):
def load_image(image: ImageTyping, mode=None, force_background: Optional[str] = 'white'):
    if isinstance(image, (str, PathLike, bytes, bytearray, BinaryIO)) or _is_readable(image):
        image = Image.open(image)
    elif isinstance(image, Image.Image):
@@ -25,6 +26,9 @@ def load_image(image: ImageTyping, mode=None):
    else:
        raise TypeError(f'Unknown image type - {image!r}.')

    if force_background is not None:
        image = add_background_for_rgba(image, force_background)

    if mode is not None and image.mode != mode:
        image = image.convert(mode)

@@ -36,3 +40,13 @@ def load_images(images: MultiImagesTyping, mode=None) -> List[Image.Image]:
        images = [images]

    return [load_image(item, mode) for item in images]


def add_background_for_rgba(image: ImageTyping, background: str = 'white'):
    if not isinstance(image, Image.Image):
        image = load_image(image)
    image = image.convert("RGBA")
    new_image = Image.new("RGBA", image.size, background)
    new_image.paste(image, mask=image)
    image = new_image.convert("RGB")
    return image
+1 −1
Original line number Diff line number Diff line
@@ -20,6 +20,6 @@ class TestDataImage:
            with pytest.raises(result):
                _ = load_image(image_)
        elif isinstance(image_, Image.Image):
            assert load_image(image_) is image_
            assert load_image(image_, force_background=None) is image_
        else:
            assert image_diff(load_image(image_), result, throw_exception=False) < 1e-2