Refine README panel picture-in-picture layout

This commit is contained in:
Meta Vens 2026-04-22 12:34:11 +01:00
commit a98232332a
3 changed files with 37 additions and 13 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 382 KiB

After

Width:  |  Height:  |  Size: 383 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 38 KiB

After

Width:  |  Height:  |  Size: 36 KiB

Before After
Before After

View file

@ -152,7 +152,7 @@ def _build_guard_strip(
include_lanczos: bool = True,
panel_width: int = 220,
panel_height: int = 170,
title: str = "Sword guard close-up",
title: str | None = "Sword guard close-up",
) -> Image.Image:
panels = [
_render_panel("Source", rgba=source_crop, pixelated=True, panel_width=panel_width, panel_height=panel_height),
@ -163,14 +163,15 @@ def _build_guard_strip(
1,
_render_panel("Lanczos", rgba=lanczos_crop, pixelated=True, panel_width=panel_width, panel_height=panel_height),
)
title_height = 24
title_height = 24 if title else 0
gap = 10
width = sum(panel.image.width for panel in panels) + gap * (len(panels) + 1)
height = title_height + max(panel.image.height for panel in panels) + gap * 2
canvas = Image.new("RGBA", (width, height), (14, 14, 16, 242))
draw = ImageDraw.Draw(canvas)
draw.rounded_rectangle((0, 0, width - 1, height - 1), radius=12, fill=(14, 14, 16, 242), outline=(92, 92, 104, 255), width=1)
draw.text((gap, 4), title, fill=(255, 255, 255, 255))
if title:
draw.text((gap, 4), title, fill=(255, 255, 255, 255))
x = gap
for panel in panels:
canvas.alpha_composite(panel.image, (x, title_height + gap))
@ -178,6 +179,34 @@ def _build_guard_strip(
return canvas
def _build_pip_inset(
rgba_crop: np.ndarray,
*,
width: int = 126,
height: int = 94,
) -> Image.Image:
fitted, (inner_x, inner_y, inner_w, inner_h) = _fit_rgba(
rgba_crop,
target_width=width - 12,
target_height=height - 12,
pixelated=True,
)
canvas = Image.new("RGBA", (width, height), (14, 14, 16, 236))
draw = ImageDraw.Draw(canvas)
draw.rounded_rectangle((0, 0, width - 1, height - 1), radius=10, fill=(14, 14, 16, 236), outline=(92, 92, 104, 255), width=1)
checker = _checkerboard(width - 12, height - 12, tile=8)
canvas.alpha_composite(checker, (6, 6))
canvas.alpha_composite(fitted, (6 + inner_x, 6 + inner_y))
return canvas
def _add_pip_inset(render: RenderedPanel, inset: Image.Image, *, margin_x: int = 12, margin_y: int = 12) -> None:
inner_x, inner_y, inner_w, inner_h = render.content_box
placement_x = inner_x + max(0, inner_w - inset.width - margin_x)
placement_y = inner_y + max(0, inner_h - inset.height - margin_y)
render.image.alpha_composite(inset, (placement_x, placement_y))
def _cell_bbox_to_source_bbox(
cell_bbox: tuple[int, int, int, int],
*,
@ -325,17 +354,16 @@ def main() -> None:
_crop_rgba(ai_source, guard_bbox),
_crop_rgba(ai_lanczos_preview, guard_bbox),
_crop_rgba(ai_repixelized_preview, guard_bbox),
title=None,
)
guard_strip.save(out_guard_crop)
guard_inset = _build_guard_strip(
ai_crops = [
_crop_rgba(ai_source, guard_bbox),
_crop_rgba(ai_lanczos_preview, guard_bbox),
_crop_rgba(ai_repixelized_preview, guard_bbox),
include_lanczos=False,
panel_width=190,
panel_height=142,
title="Sword guard",
)
]
for panel, crop in zip(ai_panels, ai_crops, strict=True):
_add_pip_inset(panel, _build_pip_inset(crop))
width = margin * 2 + panel_width * 3 + col_gap * 2
height = margin * 2 + row_title_height * 2 + panel_height * 2 + row_gap
@ -355,10 +383,6 @@ def main() -> None:
canvas.alpha_composite(panel.image, (x, row2_y))
x += panel_width + col_gap
inset_x = width - guard_inset.width - margin
inset_y = row2_y + panel_height - guard_inset.height - 18
canvas.alpha_composite(guard_inset, (inset_x, inset_y))
out_sheet.parent.mkdir(parents=True, exist_ok=True)
canvas.save(out_sheet)