Files
vllm-project--vllm/vllm/multimodal/image.py
T
wehub-resource-sync 7ce4c8e27e
pre-commit / pre-run-check (push) Has been cancelled
pre-commit / pre-commit (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 12:55:37 +08:00

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)