一、结论先给
九宫格 = 把一张图等分成 3×3,发的时候按 1→9 顺序上传。
三件事决定了最终效果:
| 问题 | 答案 |
|---|---|
| 显示顺序 | 从上到下、从左到右,第 1 格是封面(缩略图) |
| 原图比例 | 正方形 1:1 最稳;小红书用 3:4 竖图 |
| 单张尺寸 | 长边 1080-1440px,单张 ≤ 1 MB(超了微信会二次压缩) |
┌───┬───┬───┐
│ 1 │ 2 │ 3 │ ← 1 在左上,是封面
├───┼───┼───┤
│ 4 │ 5 │ 6 │
├───┼───┼───┤
│ 7 │ 8 │ 9 │
└───┴───┴───┘
最重要的一条:第 1 格会出现在缩略图位置,所以构图时要把主体(人脸、标题、产品)放在左上区域,别放在正中间——正中间那格(第 5 格)在九宫格里会被四条缝线切开,最不显眼。
二、平台尺寸对照表
| 平台 | 推荐比例 | 推荐像素 | 单张上限 | 说明 |
|---|---|---|---|---|
| 微信朋友圈 | 1:1 | 1080 × 1080 | 建议 ≤ 1 MB | 超过会被压缩,1:1 显示最完整 |
| 微信朋友圈(竖图) | 3:4 | 1080 × 1440 | ≤ 1 MB | 显示区域会被裁成 1:1 缩略图 |
| 小红书 | 3:4 | 1080 × 1440 | ≤ 10 MB | 3:4 是流量最好的比例 |
| 小红书(方图) | 1:1 | 1080 × 1080 | ≤ 10 MB | |
| 微博 | 4:3 / 16:9 | 1200 × 900 | ≤ 5 MB | 横图更适合 |
| 抖音图文 | 9:16 | 1080 × 1920 | ≤ 10 MB | 全屏竖版 |
九宫格的主要战场是朋友圈和小红书,所以优先准备 1:1 和 3:4 两个版本。
原图建议分辨率:切成九宫格后每格 = 原图的 1/9 面积。
| 目标单格 | 原图应为 |
|---|---|
| 360 × 360(够发) | 1080 × 1080 |
| 480 × 480(清晰) | 1440 × 1440 |
| 480 × 640(小红书 3:4) | 1440 × 1920 |
三、ImageMagick:一行切完
3.1 基础切法
# 3×3 等分,自动补零命名 slice-0.png ... slice-8.png
magick input.jpg -crop 3x3@ +repage slice.png
关键在 -crop 3x3@ 的 @ 符号:
| 写法 | 行为 | 问题 |
|---|---|---|
-crop 3x3@ |
自动计算每格尺寸,整除不整除都能用 | 无 |
-crop 360x360 |
按固定尺寸切 | 原图不是 1080 时,边缘会多出碎块 |
@ 必加。不加的话 1000×1000 的图按 333×333 切会变成 4×4=16 块,最后一块还是残缺的。
+repage 也必加——不带它,每块图会保留原图的画布偏移信息,导致有的图打开后大片空白。
3.2 完整命令(含预处理)
# 一步到位:裁成 1:1 正方形 → 缩到 1440 → 切九宫格 → 输出 JPG
magick input.jpg \
-resize 1440x1440^ -gravity center -extent 1440x1440 \
-crop 3x3@ +repage \
-quality 88 \
slice.jpg
分步解释:
| 参数 | 作用 |
|---|---|
-resize 1440x1440^ |
^ 表示"至少填满",等比缩放到能覆盖 1440×1440 |
-gravity center -extent 1440x1440 |
从中心裁出正方形 |
-crop 3x3@ |
等分 3×3 |
+repage |
重置画布偏移 |
-quality 88 |
JPG 质量,88 是清晰度与体积的平衡点 |
3.3 竖图切法(小红书 3:4)
magick input.jpg \
-resize 1440x1920^ -gravity center -extent 1440x1920 \
-crop 3x3@ +repage \
-quality 88 \
slice.jpg
3.4 只切上半部分(构图不好时)
# 先裁掉下方 20%,再切
magick input.jpg -gravity north -chop 0x20% -crop 3x3@ +repage slice.jpg
四、Python 切法(要批量或要定制时)
from PIL import Image
import os
def slice_nine(src, out_dir='out', rows=3, cols=3, target=None, quality=88):
os.makedirs(out_dir, exist_ok=True)
im = Image.open(src)
# EXIF 方向修正(手机拍的图经常带旋转标记)
try:
from PIL import ImageOps
im = ImageOps.exif_transpose(im)
except Exception:
pass
im = im.convert('RGB')
# 缩放到目标尺寸(居中裁剪成正方形)
if target:
w, h = im.size
s = max(target[0] / w, target[1] / h)
im = im.resize((int(w * s), int(h * s)), Image.LANCZOS)
w, h = im.size
left, top = (w - target[0]) // 2, (h - target[1]) // 2
im = im.crop((left, top, left + target[0], top + target[1]))
W, H = im.size
cw, ch = W // cols, H // rows
n = 0
for r in range(rows):
for c in range(cols):
# 最后一行/列吃掉余数,保证不漏边
right = W if c == cols - 1 else (c + 1) * cw
bottom = H if r == rows - 1 else (r + 1) * ch
box = (c * cw, r * ch, right, bottom)
piece = im.crop(box)
piece.save(f'{out_dir}/slice-{n:02d}.jpg', quality=quality)
n += 1
return n
slice_nine('photo.jpg', target=(1440, 1440))
两个容易忽略的点:
ImageOps.exif_transpose()——手机竖拍的照片,PIL 直接打开可能是躺着的,切完全乱。- 最后一行/列要吃掉余数(
W if c == cols-1 else ...),否则 1441px 宽的图会漏掉最右边 1px。
五、竖图和横图:先裁剪还是先补白
原图不是目标比例时,两条路:
| 方案 | 做法 | 代价 | 适合 |
|---|---|---|---|
| 居中裁剪 | -extent |
丢掉边缘内容 | 照片、人像(主体在中间) |
| 补白边 | -background white -gravity center -extent |
出现白边 | 有文字的图、不能裁的海报 |
| 补模糊背景 | 放大模糊做底 + 原图居中 | 处理复杂 | 竖图转方图,效果最自然 |
# 居中裁剪(丢边缘)
magick input.jpg -resize 1440x1440^ -gravity center -extent 1440x1440 out.jpg
# 补白边(保完整)
magick input.jpg -resize 1440x1440 -background white -gravity center -extent 1440x1440 out.jpg
# 补模糊底(最好看)
magick input.jpg \
\( -clone 0 -resize 1440x1440^ -gravity center -extent 1440x1440 -blur 0x20 \) \
\( -clone 0 -resize 1440x1440 \) \
-gravity center -composite out.jpg
默认推荐居中裁剪:九宫格发在朋友圈,尺寸本来就小,白边会显得很廉价。
六、五个高频坑
6.1 发到微信顺序乱了
微信按上传顺序显示,不从文件名推断。手动选图时一次选中 9 张,多数情况下顺序是对的,但部分安卓机型会乱。
对策:
# 文件名补零,保证字典序 = 视觉序
slice-00.jpg slice-01.jpg ... slice-08.jpg
上传时按顺序点,别全选。
6.2 切完发微信变糊
微信对超过阈值的图会二次压缩。实测经验(非官方数据):
- 单张超过 1 MB、长边超过 1440px 更容易被压
- 压缩后肉眼可见糊,尤其是有文字的图
对策:长边控制在 1080-1440,单张 200-800 KB。切完用 图片压缩 统一压一轮再发。
6.3 边缘对不齐、接缝明显
原因:原图尺寸不能被 3 整除,用固定尺寸切导致每块大小不一。
对策:-crop 3x3@ 自动等分;Python 里让最后一块吃掉余数。
另外发朋友圈本来就有缝(微信自己加了间距), seam 明显是正常的,不是切图的问题。
6.4 图是躺着的
手机竖拍照片带 EXIF 方向标记,ImageMagick 和 PIL 默认不处理。
# ImageMagick 自动摆正
magick input.jpg -auto-orient out.jpg
# 完整命令里加在最前面
magick input.jpg -auto-orient -resize 1440x1440^ -gravity center -extent 1440x1440 -crop 3x3@ +repage slice.jpg
6.5 透明 PNG 切完有黑边
magick input.png -background white -alpha remove -alpha off -crop 3x3@ +repage slice.jpg
七、批量脚本
#!/usr/bin/env bash
# 把当前目录所有图片切成九宫格,每个图一个目录
set -euo pipefail
TARGET=${1:-1440x1440}
for f in *.jpg *.jpeg *.png; do
[ -e "$f" ] || continue
d="nine/${f%.*}"
mkdir -p "$d"
magick "$f" -auto-orient \
-resize "${TARGET}^" -gravity center -extent "$TARGET" \
-crop 3x3@ +repage -quality 88 "$d/slice.jpg"
echo "$f -> $d ($(ls "$d" | wc -l) 张)"
done
八、不想敲命令
偶尔切一次,装 ImageMagick 不值当。浏览器里也能切:九宫格切图工具 上传后自动 3×3,按 00-08 命名打包,本地处理不上传服务器。切完想调尺寸可以再走 图片裁剪。
九、几条纪律
- 第 1 格放主体,别放正中间(第 5 格会被缝线切开)。
-crop 3x3@的@不能省,否则不整除就碎。+repage必须加,不然有的格子打开是空白。- 先
-auto-orient摆正手机照片。 - 长边 1080-1440、单张 ≤ 1 MB,避开微信二次压缩。
- 上传时按文件名顺序点,别图省事全选。
- 原图先裁成正方形再切,比例不对切出来必然变形。