import io import numpy as np from PIL import Image def to_bytes(image: Image.Image) -> bytes: with io.BytesIO() as output: image.save(output, format="JPEG") return output.getvalue() def resize_image(image: Image.Image, dimension: int = 512) -> Image.Image: iw, ih = image.size if iw > ih: image = image.resize((dimension, int(dimension * ih / iw))) else: image = image.resize((int(dimension * iw / ih), dimension)) return image def HWC3(x): "x: numpy array" assert x.dtype == np.uint8 if x.ndim == 2: x = x[:, :, None] assert x.ndim == 3 H, W, C = x.shape assert C == 1 or C == 3 or C == 4 if C == 3: return x if C == 1: return np.concatenate([x, x, x], axis=2) if C == 4: color = x[:, :, 0:3].astype(np.float32) alpha = x[:, :, 3:4].astype(np.float32) / 255.0 y = color * alpha + 255.0 * (1.0 - alpha) y = y.clip(0, 255).astype(np.uint8) return y def from_bytes(data: bytes) -> Image.Image: return Image.open(io.BytesIO(data)) def padd_image(image: Image.Image, to_width: int, to_height: int) -> Image.Image: iw, ih = image.size img = Image.new("RGBA", (to_width, to_height), (0, 0, 0, 0)) img.paste(image, ((to_width - iw) // 2, (to_height - ih) // 2)) return img