问题
_fit_to 用 Image.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 尺寸契约。
验收
小于画布的母版输入不再原尺寸贴入;新增用例在换回旧实现时失败。
问题
_fit_to用Image.thumbnail()缩放后居中贴入目标画布,而thumbnail()只缩不放:Windup/backend/packages/app/src/windup_app/server/orchestrator/executor.py
Lines 112 to 131 in d587dc8
源图小于项目 sprite 尺寸时,主体原尺寸居中贴入,占幅被压小且后续无环节补回。唯一活跃调用点是母版生成出口(
executor.py:705)。序列帧路径曾用同一个函数,2026-08-11 实测「256 的帧原尺寸贴进 512 画布,脚线 0.92 被挪到 0.709」后换成了
_require_size,母版这条没跟着换。视频首帧那份同类缺陷由 #509 处理,不覆盖本处。现有测试没有「源图小于目标画布」的分支,把小图原尺寸贴进大画布也能通过。
范围
母版适配改成等比 contain,或照序列帧改成尺寸不符即报错;补主体占幅的用例。不改 sprite 尺寸契约。
验收
小于画布的母版输入不再原尺寸贴入;新增用例在换回旧实现时失败。