产品发布,要在公司的 Instagram 主页上铺一张大横幅:连发九条帖子,在主页上拼成一整张图。横幅是一张 4000 × 3000 的 PNG。这活儿最后落到了开发者手里,理由是「不就是把图切成九块吗」。

第一版用一个随手写的脚本,切出 1333 × 1000 的切片。最右边一列像素丢了,这一点没人看得出来。接下来两个问题却人人都看得见。第一,帖子按阅读顺序发,先发左上角那块,结果主页上的横幅整个倒了过来:Instagram 把最新的帖子放在左上角。第二,切片是正方形,而主页网格现在把帖子显示成竖向长方形,每块左右各被裁掉一条,画面在帖子之间再也接不上。

这三个问题都有精确的解法:切割线用四舍五入来定位,一个像素都不丢;切片按发布顺序编号;按网格实际显示的比例来切。同一套切割线规则也适用于分块打印海报,以及把雪碧图切回单帧。朋友圈九宫格切图是同一回事,只是顺序和比例的规则不同。本文逐一讲清这些规则和容易踩的坑,并附上 Python、JavaScript 和命令行代码。

在线分割图片 →

什么时候需要分割图片

场景需要什么用哪个模式
一张图铺满 Instagram 主页的 3、6 或 9 条帖子竖向切片,按发布顺序编号Instagram,主页网格
一张全景图做成轮播,左右滑动时首尾相接2 到 20 张同尺寸的图,从左到右Instagram,轮播
朋友圈九宫格:一张图拆成 9 张,发出来拼回原图9 块正方形,按阅读顺序排列按行列,3 × 3
小红书多图笔记:一张长幅画面分成几张 3:4 竖图滑着看同尺寸竖图,从左到右Instagram,轮播,单图尺寸 3:4
海报用 A4 或 Letter 纸分块打印,再拼贴起来原分辨率的等分切片按行列,例如 2 × 3 或 3 × 4
雪碧图或图标合集要切回单帧固定尺寸的格子,带外框和间隙按尺寸,设置外边距和间距
整页长截图要放进幻灯片、聊天窗口或工单每条都能在一屏内看全的横条按行列,1 列 N 行
给关卡编辑器准备地图分块或纹理切片固定像素尺寸的正方形切片按尺寸

「按行列」和「按尺寸」保留原始像素。Instagram 模式把每块缩放到 1080 px 宽,这是 Instagram 帖子尺寸通常采用的宽度。

等分而不丢像素

大多数图片的尺寸除不尽。4000 px 宽的图片切 3 列,每列 1333.33 px。代码如果把每块都向下取整成 1333 px,最后一列像素就被漏掉了;如果向上取整成 1334 px,相邻切片会重叠,或者最后一块读到了图片边界之外。

解法是对切割线取整,而不是对切片宽度取整。长度为 L、分成 n 份时,第 i 条切割线位于:

x_i = round(i × L / n)      for i = 0 … n
tile i spans [x_i, x_(i+1))

4000 px 切 3 列,切割线在 0、1333、2667 和 4000,切片宽度依次是 1333、1334 和 1333 px。宽度换成 4001 px,则是 1334、1333 和 1334。这个公式带来三条性质:

  • 第一条切割线是 0,最后一条是 L,所以每个像素恰好落在一块切片里。
  • 各切片宽度最多相差 1 px。
  • 多出来的像素分散在整行里,不会全堆到最后一块。

图片分割工具的「按行列」模式在行和列两个方向都用这个公式。每块切片都按自身尺寸直接从解码后的图片复制出来,不做缩放,所以切片能严丝合缝地拼回原图。行数和列数各为 1 到 20。如果要切的行数比图片高度的像素数还多,工具会自动调低行数并说明原因。

ImageMagick 内置了同样的思路:-crop 加上 @ 标志,表示按切片数量而不是按切片尺寸来分割。它的使用指南写明各切片尺寸「最多相差 1 像素」。但它不保证切割位置和上面的公式一致,所以别把它切出的切片和其他工具切出的切片混在同一套里。

Instagram 主页拼图

主页拼图是一组帖子,它们在你的主页上拼成一张完整的图。切片该怎么切、怎么发,由三个事实决定。

网格三列,最新的帖子在最前

主页每行显示三条帖子,最新的一条在左上角。对 3 × 3 的一组来说,右下角那块必须最先发,左上角那块最后发。按网格写出来,发布序号是:

9  8  7
6  5  4
3  2  1

一共 R 行 3 列时,第 r 行第 c 列的切片(都从 0 开始数)序号为 (R − 1 − r) × 3 + (2 − c) + 1。图片分割工具在预览里把这个序号标在每块切片上,文件也按同样的顺序命名:九条帖子就是 trip-post-1.jpg 到 trip-post-9.jpg。序号按总数的位数补零,所以 12 条帖子的一组是 trip-post-01.jpg 到 trip-post-12.jpg,两种情况下按文件名排序都等于发布顺序。ZIP 里的文件也按发布顺序存放。

行数为 1 到 10,一组最多 30 条帖子。

网格显示竖向切片

2025 年 1 月,Instagram 负责人 Adam Mosseri 宣布主页网格改为以长方形而非正方形显示帖子(The Verge,2025 年 1 月 17 日)。2025 年 5 月下旬,他又宣布单图帖子和轮播支持 3:4 照片(The Verge,2025 年 5 月 29 日),同一周的报道称网格格子的比例为 3:4(DivePhotoGuide,2025 年 6 月 1 日)。

我们没有找到 Instagram 帮助中心里写明网格格子比例的页面。多数报道给出的是 3:4,所以工具把它作为主页网格的默认值。宽 1080 px 时,3:4 的帖子是 1080 × 1440。各方报道对 Instagram 保留的最大像素尺寸说法不一,也有报道称一些发布工具只接受最高 4:5 的竖图。如果你用的工具拒收 3:4 文件,就按 4:5 重新切一遍。

工具提供三种单图尺寸:

单图尺寸像素适用于
3:41080 × 1440主页拼图(默认)
4:51080 × 1350轮播(默认),或给只支持到 4:5 的发布工具用的主页拼图
1:11080 × 1080正方形帖子

居中裁剪时,放进 3:4 格子的正方形切片左右各被裁掉八分之一的宽度。放到一整组里,每条跨越相邻帖子的线条都会在这些缺口处断开。

帖子之间有间隙

网格的格子之间有一道细缝。切片是边对边切的,被细缝盖住的那一窄条画面就看不到了。照片里这几乎察觉不到;但如果有文字或直线横跨细缝,就要让它们远离切片边缘。工具不模拟这些间隙。

裁剪还是留边

3 × 3 组、每条 3:4 的帖子合起来是 3240 × 4320 px,整体也是 3:4。原图几乎不可能正好是这个比例,所以工具在「比例不符时」提供两种处理:

  • 裁剪:在图片里取一块符合整组比例的最大区域。你可以在预览上拖动这块区域,或者选中后用方向键移动它,区域大小始终保持最大。
  • 留边:把整张图完整放进整组画布,其余部分填充你选的颜色。适合 Logo、长截图或不能被裁的作品。图片覆盖不到的切片会导出为留边颜色的纯色图。

之后每块切片缩放到 1080 px 宽。如果裁剪区域每列不足 1080 px,切片会被放大,工具会显示放大倍数。一张 4000 × 3000 的横向照片切成 3 × 3、每条 3:4,裁剪区域是 2250 × 3000 px。Instagram 需要横向 3240 px,所以切片被放大 1.44 倍。同一张照片如果切成一行三条 3:4 帖子,区域是 4000 × 1778,会被缩小,画面保持清晰。

Instagram 轮播

轮播是一条带多张图的帖子,大家左右滑动着看。自 2024 年 8 月 8 日起,一条轮播最多可放 20 张照片或视频,此前上限是 10(The Verge,2024 年 8 月 8 日)。图片分割工具在一行里切出 2 到 20 张,从左到右编号为 pano-slide-1.jpg、pano-slide-2.jpg 等。按这个顺序加入帖子即可。

全景图切成轮播,只有每张尺寸相同时滑起来才无缝,所以工具让每张都按同一个单图尺寸导出。轮播默认 4:5(1080 × 1350)。五张 4:5 拼成 5400 × 1350 的长条,比例 4:1。一张 12000 × 3000 的全景图正好放进去,不用裁剪。

朋友圈九宫格与小红书拼图

国内最常见的切图需求是朋友圈九宫格。它和 Instagram 主页拼图看起来很像,规则却有两处相反。

顺序是阅读顺序。 朋友圈发 9 张图时,按选图顺序从左到右、从上到下排成 3 × 3。所以要用「按行列」模式切 3 × 3,第一张选左上角那块。文件名形如 poster-r1-c1.png、poster-r1-c2.png……poster-r3-c3.png,行号在前、列号在后,按文件名排序就是选图顺序,从头到尾依次勾选即可。别用 Instagram 模式的编号来发朋友圈:那套编号是倒序的,1 号是右下角。

缩略图是正方形。 多图动态的每张缩略图按正方形居中裁切显示。原图不是正方形时,每块切片都会被裁掉一截,拼起来的画面对不上。先把原图裁成正方形再切:3000 × 3000 的图切出 9 块 1000 × 1000 的正方形。边长不是 3 的倍数也没关系,切割线按上文的公式取整,各块最多差 1 px,缩略图里看不出来。

原图不是正方形,又不想另外找工具裁,可以借用 Instagram 模式:主页网格、3 行、单图尺寸 1:1、比例不符时选「裁剪」,在预览上拖出要保留的正方形区域,导出 9 张 1080 × 1080。代价是编号倒序,发朋友圈时要从 9 号选到 1 号。如果区域每列不足 1080 px,工具会提示放大倍数。

同样的思路也适用于其他宫格:朋友圈发 4 张图时排成 2 × 2,用「按行列」2 × 2 切;6 张是两行三列,切 2 行 3 列。和 Instagram 一样,缩略图之间有细缝,横跨切片边缘的文字要留出余量。

小红书的多图笔记是左右滑动的,更接近 Instagram 轮播。笔记常用 3:4 竖图,所以把一张长幅画面做成小红书拼图时,选 Instagram 模式的「轮播(单行)」,单图尺寸改成 3:4,每张导出 1080 × 1440,按文件名里 slide-1、slide-2 的顺序上传,左右滑动时画面首尾相接。

雪碧图:切片尺寸、外边距与间距

游戏雪碧图(sprite sheet)和图标合集按固定尺寸的格子排布,而不是固定的行数和列数。「按尺寸」模式用四个数字来读取它们:

  • 切片宽度和切片高度:单帧的像素尺寸。
  • 外边距:第一帧之前的空白边框,位于图的上方和左侧。
  • 间距:相邻两帧之间的空隙。

一行里第 c 帧的起点是 margin + c × (tile width + spacing),行的方向用切片高度按同样规则计算。如果一张图外框 2 px、32 × 32 的帧之间隔 1 px,就填 32、32、2 和 1。地图编辑器 Tiled 的图块集格式里用的也是这两个术语(margin 和 spacing)。

两个选项处理图的边缘:

  • 丢弃边缘不完整的切片:去掉在右边缘或下边缘被截断的切片。不勾选时,残缺的最后一列或一行会保留为较小的切片。
  • 跳过全透明切片:去掉每个像素 alpha 都为 0 的格子,比如最后一行末尾的空格子。

一次最多切 400 块。超出时,工具会提示你加大切片尺寸或间距。要把单帧反过来拼成一张雪碧图,用雪碧图生成器。

输出、文件名与隐私

切片可导出为 PNG、JPG 或 WebP。PNG 保留透明度,每个像素都原样不变。JPG 和 WebP 有 50 到 100 的质量滑块(默认 92)。JPG 没有 alpha 通道,因此另有一个透明区域的背景色(默认白色)。浏览器不支持编码 WebP 时会改存 PNG,状态栏会说明。

文件名取自原文件名,粘贴的图片用 image:

模式文件名示例ZIP 文件名
按行列、按尺寸poster-r1-c1.png、poster-r1-c2.png(第几行、第几列,从 1 开始)poster-tiles.zip
Instagram 主页网格trip-post-1.jpg … trip-post-9.jpg(发布顺序)trip-instagram.zip
Instagram 轮播pano-slide-1.jpg … pano-slide-5.jpg(从左到右)pano-instagram.zip

ZIP 采用 STORED(仅存储不压缩)方式。PNG、JPG 和 WebP 数据本身已经压缩过,再压一遍收益很小。每块切片也有单独的下载按钮。

图片从不离开页面。它通过 File API 读入,用 createImageBitmap 解码,逐块画到 canvas 上,再用 canvas.toBlob() 编码。ZIP 在内存里生成。工具不会为图片或任何切片发起网络请求。每块切片都画到新的 canvas 上重新编码,所以 GPS 位置、相机型号、拍摄时间等 EXIF 数据不会被带进切片。唯一保存下来的是你的设置(模式、尺寸、边缘选项、单图尺寸、比例处理方式、颜色、格式和质量),存在 local storage 里。和站内其他工具一样,它会向 Google Analytics 发送一个使用事件,内容是工具名和「split」「zip」这类动作名,不包含文件名和图片内容。

常见陷阱与边界情况

拼图在主页上倒了或错位了

按阅读顺序发帖,左上角那块会跑到整组的右下角。按编号发,从 1 开始。整组发完之后,每多发一条单独的帖子,所有切片都会往后挪一格,行就错开了。一次发三的倍数条,行才能保持对齐。置顶帖子也会排在最新帖子前面:Instagram 允许置顶最多三条帖子,它们位于网格左上角(The Verge,2022 年 6 月 7 日)。检查效果前先取消置顶。

手机照片切出来是横躺的

手机常按传感器方向存储照片,再加一个 EXIF 标签说明该怎么旋转。忽略这个标签的代码会把照片横着切。在浏览器里,传入 imageOrientation: 'from-image' 时 createImageBitmap 会应用这个标签,MDN 注明这是默认值。Pillow 的 Image.open 不会应用它,所以要先调用 ImageOps.exif_transpose,下面的 Python 示例就是这么做的。ImageMagick 加上 -auto-orient 才会应用。

Python 的 round() 会挪动切割线

Python 3 的 round() 用的是银行家舍入,.5 舍入到最近的偶数:round(2.5) 是 2,round(3.5) 是 4。而 JavaScript 的 Math.round(2.5) 是 3。5 px 切 2 列,中间那条切割线在 Python 里是 2,在 JavaScript 里是 3,于是同一张图,Python 脚本和浏览器端工具切出的切片不一样。改用整数运算 (2 × i × L + n) // (2 × n),.5 一律向上舍入,在这些取值下与 Math.round 结果一致。

ffmpeg 把奇数尺寸裁成偶数

JPEG 通常解码为带色度抽样的像素格式,比如 4:2:0。对这类格式,除非设置 exact=1,ffmpeg 的 crop 滤镜会把尺寸和位置向下取整到偶数,滤镜文档里写明了这一点。我们实测从 4:2:0 JPEG 请求 1334 × 1001 的切片,得到的是 1334 × 1000。先解码成 RGBA(Bash 示例就是这么做的),或者设置 exact=1。

雪碧图右边或下边冒出很窄的切片

外边距只作用于上方和左侧。如果图的右边和下边也有边框,最后一个切片起点可能落在边框里,切出一块只有几像素宽的切片。勾选「丢弃边缘不完整的切片」;边框是透明的,也可以勾选「跳过全透明切片」。

透明区域变成白色或黑色

JPG 存不了透明度,透明像素必须填一个颜色。本工具用 JPG 背景色填充,其他工具可能替你挑一个颜色。切片要叠在其他内容上方时,导出 PNG 或 WebP。

发出去的图发虚

Instagram 切片宽 1080 px。3 × 3 的一组需要裁剪区域横向有 3240 px,20 张的轮播需要 21,600 px。原图不够大,切片就会被放大。看一眼工具显示的放大倍数,明显大于 1 时,换一张更大的原图,或者减少列数。

超大图片被拒收

解码后的图片按每像素 4 字节留在内存里。工具最多接受 5000 万像素(解码后约 200 MB)、单边 16,384 px,这样在手机上也能跑。每块切片都画在各自的 canvas 上,必须在 16,777,216 像素以内,这是 canvas-size 项目在 Mobile Safari 上测出的最大 canvas 面积。更大的文件请用下文的命令行示例。

GIF 动图只切出一套切片

图片按静态图解码,所以 GIF 动图只取第一帧。要把每一帧都拆出来,用 GIF 拆帧工具。

代码示例

Python:用 Pillow 切网格、切雪碧图、算发布顺序

from pathlib import Path
from PIL import Image, ImageOps


def boundaries(n, length):
    # round(i * length / n),.5 向上舍入,与 JavaScript 的 Math.round 一致。
    # Python 的 round() 会把 2.5 舍成 2,所以改用整数运算。
    return [(2 * i * length + n) // (2 * n) for i in range(n + 1)]


def split_grid(path, rows, cols, out_dir="tiles"):
    src = Path(path)
    img = ImageOps.exif_transpose(Image.open(src))  # 先应用 EXIF 旋转
    xb, yb = boundaries(cols, img.width), boundaries(rows, img.height)
    out = Path(out_dir)
    out.mkdir(exist_ok=True)
    rd, cd = len(str(rows)), len(str(cols))
    for r in range(rows):
        for c in range(cols):
            tile = img.crop((xb[c], yb[r], xb[c + 1], yb[r + 1]))  # (左, 上, 右, 下)
            tile.save(out / f"{src.stem}-r{r + 1:0{rd}}-c{c + 1:0{cd}}.png")


def split_sheet(path, tile_w, tile_h, margin=0, spacing=0, out_dir="frames"):
    img = Image.open(path).convert("RGBA")
    out = Path(out_dir)
    out.mkdir(exist_ok=True)
    n = 0
    for y in range(margin, img.height - tile_h + 1, tile_h + spacing):
        for x in range(margin, img.width - tile_w + 1, tile_w + spacing):
            tile = img.crop((x, y, x + tile_w, y + tile_h))
            if tile.getchannel("A").getbbox() is None:  # 全透明的格子
                continue
            n += 1
            tile.save(out / f"frame-{n:03}.png")
    return n


def post_number(r, c, rows, cols=3):
    # 主页网格把最新的帖子显示在左上角,
    # 所以右下角的切片最先发。
    return (rows - 1 - r) * cols + (cols - 1 - c) + 1


if __name__ == "__main__":
    split_grid("poster.jpg", rows=3, cols=4)
    print(split_sheet("sheet.png", 32, 32, margin=2, spacing=1), "frames")
    print([[post_number(r, c, 3) for c in range(3)] for r in range(3)])

Image.crop 接收 (left, upper, right, lower) 形式的矩形框,不含右边缘和下边缘,正好对应上文的 [x_i, x_(i+1)) 区间。split_sheet 只保留完整的格子并跳过空格子,相当于在工具里同时勾选两个边缘选项。对 4000 × 3001 的图片,split_grid 写出 12 块切片:宽 1000 px,高依次为 1000、1001 和 1000 px。最后一行打印 [[9, 8, 7], [6, 5, 4], [3, 2, 1]]。切朋友圈九宫格只需把第一个调用改成 rows=3, cols=3,并先把原图裁成正方形。

JavaScript:在浏览器里用 canvas 分割文件

// 在浏览器里把图片文件切成 rows × cols 块 PNG 切片。
function edges(n, len) {
  return Array.from({ length: n + 1 }, (_, i) => Math.round((i * len) / n));
}

async function splitGrid(file, rows, cols) {
  const bitmap = await createImageBitmap(file, { imageOrientation: 'from-image' });
  const xs = edges(cols, bitmap.width);
  const ys = edges(rows, bitmap.height);
  const base = file.name.replace(/\.[^.]+$/, '') || 'image';
  const tiles = [];
  try {
    for (let r = 0; r < rows; r++) {
      for (let c = 0; c < cols; c++) {
        const w = xs[c + 1] - xs[c];
        const h = ys[r + 1] - ys[r];
        const canvas = document.createElement('canvas');
        canvas.width = w;
        canvas.height = h;
        // 源矩形 (sx, sy, sw, sh) → 同尺寸的目标矩形:不缩放。
        canvas.getContext('2d').drawImage(bitmap, xs[c], ys[r], w, h, 0, 0, w, h);
        const blob = await new Promise((resolve) => canvas.toBlob(resolve, 'image/png'));
        if (!blob) throw new Error(`Could not encode tile ${r + 1},${c + 1}`);
        tiles.push({ name: `${base}-r${r + 1}-c${c + 1}.png`, blob });
      }
    }
  } finally {
    bitmap.close(); // 释放解码后的像素
  }
  return tiles;
}

// 用法:<input type="file" id="pick" accept="image/*">
document.getElementById('pick').addEventListener('change', async (e) => {
  const file = e.target.files[0];
  if (!file) return;
  for (const { name, blob } of await splitGrid(file, 3, 3)) {
    const a = document.createElement('a');
    a.href = URL.createObjectURL(blob);
    a.download = name;
    a.click();
    setTimeout(() => URL.revokeObjectURL(a.href), 1000);
  }
});

九个参数形式的 drawImage 把源矩形复制到目标矩形。两者尺寸相同时,不会有任何像素被重新采样。toBlob 编码失败时回调收到的是 null,要检查一下。页面一次触发多个下载时,浏览器可能拦截或弹窗询问。想只下载一个文件,就把切片打包成 ZIP。

Bash:ImageMagick 与 ffmpeg

# ImageMagick:4 列 × 3 行的近似等分切片(尺寸最多相差 1 px)。
# -auto-orient 先应用手机照片的 EXIF 旋转。
magick photo.jpg -auto-orient -crop 4x3@ +repage +adjoin photo-%02d.png

# ImageMagick:固定 64 × 64 切片;尺寸不能被 64 整除时,最右和最下的切片会小一些
magick sheet.png -crop 64x64 +repage +adjoin tile-%03d.png
#!/usr/bin/env bash
# 用 ffmpeg 把图片切成 rows x cols 块,切割线位于 round(i * size / n)。
set -euo pipefail
in=${1:?usage: grid.sh image rows cols}; rows=${2:-3}; cols=${3:-3}
# 先解码成一张 RGBA PNG。crop 在 RGBA 上是精确的(输入为 4:2:0 JPEG 时
# 会把奇数尺寸取整成偶数),之后 ffprobe 读到的也是解码后的尺寸。
ffmpeg -v error -y -i "$in" -frames:v 1 -pix_fmt rgba src-rgba.png
IFS=, read -r W H < <(ffprobe -v error -select_streams v:0 \
  -show_entries stream=width,height -of csv=p=0 src-rgba.png)
edge() { echo $(( (2 * $1 * $2 + $3) / (2 * $3) )); }  # round(i * len / n)
for ((r = 0; r < rows; r++)); do
  y0=$(edge "$r" "$H" "$rows"); y1=$(edge $((r + 1)) "$H" "$rows")
  for ((c = 0; c < cols; c++)); do
    x0=$(edge "$c" "$W" "$cols"); x1=$(edge $((c + 1)) "$W" "$cols")
    ffmpeg -v error -y -i src-rgba.png \
      -vf "crop=$((x1 - x0)):$((y1 - y0)):$x0:$y0" \
      -frames:v 1 "tile-r$((r + 1))-c$((c + 1)).png"
  done
done
rm src-rgba.png

不指定位置时,ImageMagick 的 -crop 会切出一组覆盖整张图的切片。+repage 去掉每块切片保留的画布偏移,+adjoin 让每块切片写成单独的文件。@ 写法需要 ImageMagick 6.5.8-9 或更高版本。ffmpeg 脚本的运行方式是 bash grid.sh photo.jpg 3 3。对一张 4001 × 3001 的 JPEG,它写出宽 1334、1333 和 1334 px 的切片;一张随机噪点 PNG 切出的切片能逐像素拼回原图。脚本测量的是解码后的 PNG,而不是输入文件:我们测试时,ffmpeg 9.0 解码手机照片时应用了 EXIF 旋转,而对 JPEG 直接跑 ffprobe 报告的是存储的、未旋转的尺寸。

与其他图片分割工具对比

它们各自适合不同的活儿。

工具在哪运行分割方式外框与间隙Instagram 布局输出
ZeroTool 图片分割工具浏览器标签页,图片留在本地行 × 列、切片尺寸、Instagram 主页网格或轮播外边距和间距按发布顺序的主页网格、轮播,3:4 / 4:5 / 1:1PNG、JPG、WebP;ZIP 或单块下载
PineTools Split image网页块数或块尺寸,纵向、横向或双向按 px 重叠选项里没有PNG、JPG、WebP、BMP;ZIP 或单个文件
ezgif Sprite sheet cutter上传到 ezgif 的服务器切片尺寸或行列数偏移和间距无PNG、GIF、BMP、WebP、JPG;ZIP
ImageMagick -crop本地命令行切片尺寸,或用 @ 按切片数量用 @ 加负重叠可跳过间隙无ImageMagick 能写出的任意格式

PineTools 可以在任一方向按数量或按像素尺寸分割,允许块之间重叠,并且只列出你的浏览器支持的输出格式。它还有处理多张图片的批量版本。需要互相重叠的条带时用它。

ezgif 雪碧图切割器接受最大 200 MB 的上传,并声明「所有上传文件会在上传 1 小时后自动删除」。它可以给输出文件重命名,还能把切出的帧直接做成 GIF 动图、APNG、WebP 或视频。帧要拿去做动画时用它。

ImageMagick 没有浏览器内存限制,适合写进脚本和构建步骤。@ 标志一条命令就能切出近似等分的切片。

图片分割工具覆盖了另外三者留给你自己处理的 Instagram 场景:竖向切片、预览和文件名里的发布序号、裁剪或留边,以及在切片发虚之前给出提醒。它也能等分切图不丢像素,按外边距和间距切雪碧图,同样无需上传。它一次处理一张静态图,这是有意的设计。动图用 GIF 拆帧工具,成百上千个文件用脚本。

相关工具与参考资料

ZeroTool 上适合与切片搭配使用的工具:

本文参考资料: