image-merge — 图片拼接
用确定性脚本(Pillow)把多张图按固定拼接格式拼成一张。核心原则:只点选、不任意;顺序即语义、不覆盖、可校验。
工作流程
- 判断拼接格式:用户说「三联屏/九宫格」等直接对应下表 preset;没说清就用 AskUserQuestion 列出 7 个固定选项让用户点选。
- 调用
scripts/merge.py --preset <预设>(环境准备见下)。 - 核对 JSON(最终尺寸、每张位置、间隙、是否有尺寸不一致提醒)。
- present_files 展示,汇报拼接格式与最终尺寸。
固定拼接格式(点选,共 7 种)
| 点选格式 | --preset | 布局 | 需要张数 | 尺寸要求 |
|---|---|---|---|---|
| 双图横排 | two_h | 左右并排 | 2 | 需一致 |
| 三图横排(三联屏) | three_h | 左右并排 | 3 | 需一致 |
| 双图竖排 | two_v | 上下堆叠 | 2 | 需一致 |
| 长图(竖排) | long | 上下堆叠 | 任意 N 张 | 需一致 |
| 四宫格 | four | 2×2 网格 | 4 | 可不一致 |
| 六宫格 | six | 3×2 网格 | 6 | 可不一致 |
| 九宫格 | nine | 3×3 网格 | 9 | 可不一致 |
- 联排(
two_h/three_h/two_v/long)要求图片尺寸一致:尺寸不一致时脚本会打印[WARN]提醒并在 JSON 的notes说明,同时仍按居中白底对齐产出结果,供你判断。 - 宫格(
four/six/nine)允许尺寸不一:图片尺寸不变,按「贴边对齐」放置——左半贴右、右半贴左、上半贴下、下半贴上(即每张图贴向中心十字线),中心格(九宫格第 5 格)平铺填满整格;图片之间用统一的 1 毫米白色间隙隔开。 - 固定张数的格式(
two_h/three_h/two_v/four/six/nine)需传入对应张数,多了少了脚本在 JSON 里提示;long竖排不限张数。 - 唯一可选参数
--gap-mm N:图片之间留 N 毫米白色间隙(默认 1.0mm,按固定 96 DPI ≈ 4px,--dpi可覆盖)。
必须遵守
- 顺序即语义:拼接顺序 = 命令行传入顺序(不是文件名排序)。
- 永不覆盖:默认输出
原名_merge.png新文件;输出路径永不等于任一输入路径。 - 透明/EXIF/动图:EXIF 摆正、GIF 只取首帧并说明;带透明图拼到白底时在回复告知。
- 大图内存:按
paste逐张落位,避免无谓的全图 resize 放大。
环境准备(跨平台)
同 image-split(python3 → python/py -3 → 技能目录 .venv)。
脚本用法
$PY <本技能目录>/scripts/merge.py IMG1 IMG2 [IMG3 ...] \
--preset two_h|three_h|two_v|long|four|six|nine [--gap-mm 1.0] [--dpi 96] [--output out.png]
- 布局缺省
three_h(三联屏,最常见的多图横拼) - 每张图片在 JSON 里记录 {input, box:[x,y,w,h]};间隙换算记录为
gap_mm/gap_px/dpi
示例:
$PY .../scripts/merge.py a.png b.png c.png --preset three_h
# 3 images -> a_merge.png 1080x360 (preset=three_h, gap=4px)
# [{"output":".../a_merge.png","size":[1080,360],"gap_mm":1.0,"gap_px":4,"items":[...]}]
完成后的动作
- present_files 展示拼接结果
- 汇报:N 张 → 1 张、拼接格式、最终尺寸、间隙;联排尺寸不一致时须提醒用户
微信扫一扫