|
import os |
|
from typing import Callable, Union |
|
|
|
import PIL.Image |
|
import PIL.ImageOps |
|
import requests |
|
|
|
|
|
def load_image( |
|
image: Union[str, PIL.Image.Image], convert_method: Callable[[PIL.Image.Image], PIL.Image.Image] = None |
|
) -> PIL.Image.Image: |
|
""" |
|
Loads `image` to a PIL Image. |
|
|
|
Args: |
|
image (`str` or `PIL.Image.Image`): |
|
The image to convert to the PIL Image format. |
|
convert_method (Callable[[PIL.Image.Image], PIL.Image.Image], optional): |
|
A conversion method to apply to the image after loading it. When set to `None` the image will be converted |
|
"RGB". |
|
|
|
Returns: |
|
`PIL.Image.Image`: |
|
A PIL Image. |
|
""" |
|
if isinstance(image, str): |
|
if image.startswith("http://") or image.startswith("https://"): |
|
image = PIL.Image.open(requests.get(image, stream=True).raw) |
|
elif os.path.isfile(image): |
|
image = PIL.Image.open(image) |
|
else: |
|
raise ValueError( |
|
f"Incorrect path or URL. URLs must start with `http://` or `https://`, and {image} is not a valid path." |
|
) |
|
elif isinstance(image, PIL.Image.Image): |
|
image = image |
|
else: |
|
raise ValueError( |
|
"Incorrect format used for the image. Should be a URL linking to an image, a local path, or a PIL image." |
|
) |
|
|
|
image = PIL.ImageOps.exif_transpose(image) |
|
|
|
if convert_method is not None: |
|
image = convert_method(image) |
|
else: |
|
image = image.convert("RGB") |
|
|
|
return image |
|
|