Modular utils
Typo `create_image_grid_by_columns` -> `create_images_grid_by_columns`
Typo `create_image_grid_by_rows` -> `create_images_grid_by_rows`
This commit is contained in:
LEv145
2023-04-06 22:31:08 +02:00
parent 9963935c26
commit 764c5e54f9
6 changed files with 92 additions and 57 deletions
+4 -4
View File
@@ -4,8 +4,8 @@ from ..base import BaseNode, Image
from ..utils import (
tensor_to_pillow,
pillow_to_tensor,
create_image_grid_by_columns,
create_image_grid_by_rows,
create_images_grid_by_columns,
create_images_grid_by_rows,
)
@@ -36,7 +36,7 @@ class ImagesGridByColumnsNode(BaseImagesGridNode):
return cls._create_input_types("max_columns")
def execute(self, images: Image, **kw) -> tuple[Image]:
return self._create_execute(images, create_image_grid_by_columns, kw)
return self._create_execute(images, create_images_grid_by_columns, kw)
class ImagesGridByRowsNode(BaseImagesGridNode):
@@ -45,4 +45,4 @@ class ImagesGridByRowsNode(BaseImagesGridNode):
return cls._create_input_types("max_rows")
def execute(self, images: Image, **kw) -> tuple[Image]:
return self._create_execute(images, create_image_grid_by_rows, kw)
return self._create_execute(images, create_images_grid_by_rows, kw)
-53
View File
@@ -1,53 +0,0 @@
import typing as t
import torch
import numpy as np
from PIL import Image
def tensor_to_pillow(image):
return Image.fromarray(np.clip(255. * image.cpu().numpy().squeeze(), 0, 255).astype(np.uint8))
def pillow_to_tensor(image):
return torch.from_numpy(np.array(image).astype(np.float32) / 255.0).unsqueeze(0)
def create_image_grid_by_columns(
images: t.List[Image.Image],
gap: int,
max_columns: int,
) -> Image.Image:
max_rows = (len(images) + max_columns - 1) // max_columns
return create_image_grid(images=images, gap=gap, max_columns=max_columns, max_rows=max_rows)
def create_image_grid_by_rows(
images: t.List[Image.Image],
gap: int,
max_rows: int,
) -> Image.Image:
max_columns = (len(images) + max_rows - 1) // max_rows
return create_image_grid(images=images, gap=gap, max_columns=max_columns, max_rows=max_rows)
def create_image_grid(
images: t.List[Image.Image],
gap: int,
max_columns: int,
max_rows: int,
) -> Image.Image:
size = images[0].size
width = size[0] * max_columns + (max_columns - 1) * gap
height = size[1] * max_rows + (max_rows - 1) * gap
grid_image = Image.new("RGB", (width, height), color="white")
for i, image in enumerate(images):
x = (i % max_columns) * (size[0] + gap)
y = (i // max_columns) * (size[1] + gap)
grid_image.paste(image, (x, y))
return grid_image
+5
View File
@@ -0,0 +1,5 @@
from .images_grid import (
create_images_grid_by_columns,
create_images_grid_by_rows,
)
from .tensor_convert import tensor_to_pillow, pillow_to_tensor
+6
View File
@@ -0,0 +1,6 @@
from __future__ import annotations
import typing as t
def create_grid_annotations() -> None: ...
+64
View File
@@ -0,0 +1,64 @@
import typing as t
from PIL import Image, ImageDraw, ImageFont
def create_images_grid_by_columns(
images: t.List[Image.Image],
gap: int,
max_columns: int,
) -> Image.Image:
max_rows = (len(images) + max_columns - 1) // max_columns
return _create_images_grid(images=images, gap=gap, max_columns=max_columns, max_rows=max_rows)
def create_images_grid_by_rows(
images: t.List[Image.Image],
gap: int,
max_rows: int,
) -> Image.Image:
max_columns = (len(images) + max_rows - 1) // max_rows
return _create_images_grid(images=images, gap=gap, max_columns=max_columns, max_rows=max_rows)
def _create_images_grid(
images: t.List[Image.Image],
gap: int,
max_columns: int,
max_rows: int,
) -> Image.Image:
size = images[0].size
grid_width = size[0] * max_columns + (max_columns - 1) * gap
grid_height = size[1] * max_rows + (max_rows - 1) * gap
grid_image = Image.new("RGB", (grid_width, grid_height), color="white")
for i, image in enumerate(images):
image = image.crop((0, 0, size[0], size[1]))
x = (i % max_columns) * (size[0] + gap)
y = (i // max_columns) * (size[1] + gap)
grid_image.paste(image, (x, y))
return grid_image
def _draw_center_text(
text: str,
draw: ImageDraw.ImageDraw,
font: ImageFont.ImageFont,
fill: int = 128,
):
image = draw.im # type: ignore
_, _, *text_size = draw.textbbox((0, 0), text, font=font)
draw.text(
(
(image.size[0]-text_size[0])/2,
(image.size[1]-text_size[1])/2,
),
text,
font=font,
fill=fill,
)
return image
+13
View File
@@ -0,0 +1,13 @@
import typing as t
import torch
import numpy as np
from PIL import Image
def tensor_to_pillow(image: t.Any) -> Image.Image:
return Image.fromarray(np.clip(255. * image.cpu().numpy().squeeze(), 0, 255).astype(np.uint8))
def pillow_to_tensor(image: Image.Image) -> t.Any:
return torch.from_numpy(np.array(image).astype(np.float32) / 255.0).unsqueeze(0)