Skip to content

[Bug]: 母版尺寸适配只缩不放,小图交付时主体占幅被压小 #512

Description

@johnnyzhang-eng

问题

_fit_toImage.thumbnail() 缩放后居中贴入目标画布,而 thumbnail() 只缩不放:

def _fit_to(png: bytes, w: int, h: int, *, smooth: bool = False) -> bytes:
"""把图等比缩放进 w×h(透明补边),落实尺寸约束。
``smooth`` 决定重采样:序列帧是像素画,必须 NEAREST(插值会把硬边糊成灰边、
并引入调色板外的颜色);全彩角色母版反过来,NEAREST 缩图会明显锯齿,用 LANCZOS。
"""
import io
from PIL import Image
im = Image.open(io.BytesIO(png)).convert("RGBA")
if im.size == (w, h):
return png
fitted = im.copy()
fitted.thumbnail((w, h), Image.LANCZOS if smooth else Image.NEAREST)
canvas = Image.new("RGBA", (w, h), (0, 0, 0, 0))
canvas.alpha_composite(fitted, ((w - fitted.width) // 2, (h - fitted.height) // 2))
buf = io.BytesIO()
canvas.save(buf, "PNG")
return buf.getvalue()

源图小于项目 sprite 尺寸时,主体原尺寸居中贴入,占幅被压小且后续无环节补回。唯一活跃调用点是母版生成出口(executor.py:705)。

序列帧路径曾用同一个函数,2026-08-11 实测「256 的帧原尺寸贴进 512 画布,脚线 0.92 被挪到 0.709」后换成了 _require_size,母版这条没跟着换。视频首帧那份同类缺陷由 #509 处理,不覆盖本处。

现有测试没有「源图小于目标画布」的分支,把小图原尺寸贴进大画布也能通过。

范围

母版适配改成等比 contain,或照序列帧改成尺寸不符即报错;补主体占幅的用例。不改 sprite 尺寸契约。

验收

小于画布的母版输入不再原尺寸贴入;新增用例在换回旧实现时失败。

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions