61 lines
1.9 KiB
Python
61 lines
1.9 KiB
Python
# SPDX-License-Identifier: Apache-2.0
|
|
# SPDX-FileCopyrightText: Copyright contributors to the vLLM project
|
|
|
|
import contextlib
|
|
|
|
from PIL import Image, ImageOps
|
|
|
|
|
|
def rescale_image_size(
|
|
image: Image.Image, size_factor: float, transpose: int = -1
|
|
) -> Image.Image:
|
|
"""Rescale the dimensions of an image by a constant factor."""
|
|
new_width = int(image.width * size_factor)
|
|
new_height = int(image.height * size_factor)
|
|
image = image.resize((new_width, new_height))
|
|
if transpose >= 0:
|
|
image = image.transpose(Image.Transpose(transpose))
|
|
return image
|
|
|
|
|
|
def normalize_image(image: Image.Image) -> Image.Image:
|
|
"""Normalize EXIF orientation so the pixel data matches visual display."""
|
|
with contextlib.suppress(Exception):
|
|
image = ImageOps.exif_transpose(image)
|
|
return image
|
|
|
|
|
|
def rgba_to_rgb(
|
|
image: Image.Image,
|
|
background_color: tuple[int, int, int] | list[int] = (255, 255, 255),
|
|
) -> Image.Image:
|
|
"""Convert an RGBA image to RGB with filled background color."""
|
|
assert image.mode == "RGBA"
|
|
converted = Image.new("RGB", image.size, background_color)
|
|
converted.paste(image, mask=image.split()[3]) # 3 is the alpha channel
|
|
return converted
|
|
|
|
|
|
def _has_transparency(image: Image.Image) -> bool:
|
|
"""Detect whether an image carries transparency data (RGBA, LA, PA,
|
|
or tRNS chunk in P/L/RGB PNGs)."""
|
|
if image.mode in ("RGBA", "LA", "PA"):
|
|
return True
|
|
return "transparency" in getattr(image, "info", {})
|
|
|
|
|
|
def convert_image_mode(
|
|
image: Image.Image,
|
|
to_mode: str,
|
|
background_color: tuple[int, int, int] | list[int] = (255, 255, 255),
|
|
) -> Image.Image:
|
|
if image.mode == to_mode:
|
|
return image
|
|
|
|
if to_mode == "RGB" and _has_transparency(image):
|
|
if image.mode != "RGBA":
|
|
image = image.convert("RGBA")
|
|
return rgba_to_rgb(image, background_color)
|
|
|
|
return image.convert(to_mode)
|