朋友圈 9 宫格切图
图片自动切成 9 张(或 NxN)· 朋友圈 / 微博发图必备
朋友圈 9 宫格/自定义 NxN
图片自动切成 9 张(或 NxN)· 朋友圈 / 微博发图必备
使用流程:上传 → 切割 → 全部下载 → 在朋友圈按顺序选择(从上到下、从左到右)→ 发布。
建议:原图最好是正方形(1:1),否则会从中心裁剪为方形。
了解工具定位 · 使用场景 · 对比优势
发朋友圈时一张图太单调,拼成九宫格又嫌麻烦。本工具一键将单张大图切成 3×3 的九宫格,每张切片保留原图细节,发朋友圈时按顺序上传即可形成完整大图效果,适合旅行风景、美食打卡、产品展示等场景,让朋友圈排版瞬间高级。
想发 4 张、6 张、12 张图片的整齐拼图?本工具支持自定义 N×N 切割(如 2×2、2×3、3×4),不局限于九宫格。适合商家展示产品系列、摄影师发布作品集、活动主办方发布多图回顾,自由控制每张切片的尺寸和排列,让多图发布不再杂乱。
社交平台头像或封面图需要切割成多块拼成完整大图?本工具将一张大图切成多张小图,每张切片独立保存,适合做微信头像九宫格、抖音主页封面拼图、小红书笔记封面拼接。切割后每张图独立上传,别人点进主页才能看到完整效果,增加互动趣味。
线下海报或长图太大无法直接上传到社交媒体?本工具将海报按格切割成多张小图,方便在朋友圈、微博、小红书等平台分段发布。适合活动宣传、新品发布、招聘海报等场景,切割后每张图独立清晰,用户滑动浏览时能拼出完整海报,提升传播效果。
制作拼图游戏或互动素材时,需要将一张完整图片切割成多块独立图片?本工具支持自定义行列数,生成等尺寸的切片,适合教育类小游戏、亲子互动、品牌营销裂变活动。每张切片可单独命名或编号,方便后续开发或手动拼图使用。
| 维度 | 本工具 | 竞品 A(Picsart) | 传统方法(手机相册编辑) |
|---|---|---|---|
| 数据隐私 | 纯浏览器,零上传 | 需注册并上传图片至服务器 | 完全本地,无网络传输 |
| 处理速度 | 1 秒内完成切图 | 3-5 秒(含上传+处理) | 10-30 秒(手动裁剪+拼接) |
| 离线可用 | 完全离线(页面加载后) | 必须联网 | 完全离线 |
| 自定义网格 | 支持 2×2 至 9×9 任意 N×N | 仅支持 3×3(九宫格) | 需手动计算并逐张裁剪 |
| 输出格式 | PNG 单张压缩包 | PNG 单张下载(无打包) | 取决于设备保存格式 |
| 收费 | 免费,无隐藏费用 | 基础免费,去水印/高级功能需订阅 | 免费(仅需时间成本) |
| 注册要求 | 无需注册 | 需注册账号 | 无需注册 |
上手步骤 · 输入输出 · 避坑提示
| 输入 | 输出 | 说明 |
|---|---|---|
| 上传一张 1080x1080 的正方形图片 | 生成 9 张 360x360 的切片图片,按 3x3 网格排列 | 典型场景:朋友圈 9 宫格发图 |
| 上传一张 1920x1080 的横向矩形图片 | 生成 9 张 640x360 的切片图片,按 3x3 网格排列 | 典型场景:横向图片自动裁成正方形再切 |
| 上传一张 1080x1920 的竖向矩形图片 | 生成 9 张 360x640 的切片图片,按 3x3 网格排列 | 典型场景:竖向图片自动裁成正方形再切 |
| 上传一张 100x100 的小图 | 生成 9 张 33x33 的切片图片,按 3x3 网格排列 | 边界 case:极小图片,切片后可能模糊 |
| 上传一张 5000x5000 的大图 | 生成 9 张 1666x1666 的切片图片,按 3x3 网格排列 | 边界 case:超大图片,浏览器处理可能变慢 |
| 上传一张 800x600 的图片,自定义网格设为 4x4 | 生成 16 张 200x150 的切片图片,按 4x4 网格排列 | 典型场景:自定义 NxN 网格(非 9 宫格) |
| 上传一张 800x600 的图片,自定义网格设为 1x1 | 生成 1 张 800x600 的切片图片,即原图本身 | 边界 case:1x1 网格等于不切图 |
| 上传一张 800x600 的图片,自定义网格设为 5x3 | 生成 15 张 160x200 的切片图片,按 5x3 网格排列 | 易错 case:非正方形网格,行列数可不同 |
直接上传一张带透明背景的 PNG 图片(如 logo、贴纸),切图后每张切片边缘出现黑块或白块。上传前将图片合并到纯色背景(白色/灰色),或使用 JPG 格式上传。九宫格切图本质是等分裁剪,透明通道在拼接时与浏览器/系统默认背景色混合,产生视觉上的边框。合并背景可消除此问题。
上传一张 1080×1080 的图片,选择 4×4 切割(每格应为 270×270),但实际输出切片尺寸不一致。上传前将图片裁剪为 1080×1080(或 1200×1200 等 4 的倍数),或使用工具内置的“自动补边/裁剪”功能。切图算法按像素等分,余数会分配到边缘切片,导致边缘切片尺寸与中间不同,破坏九宫格对齐效果。
点击上传后立刻点击“下载全部”按钮,结果下载到空文件或只下载了部分切片。等待页面出现“处理完成”提示或切片预览图全部加载后再点击下载。九宫格切图需在浏览器端完成图片解码、分割、编码为独立图片文件(Blob),大图或高分辨率图片需要几秒处理时间。异步操作未完成时下载会失败。
在切割数输入框中填写“3x3”、“2.5”、“三”或留空。填写整数,如“3”、“4”、“5”,且 N 值在工具允许范围内(通常 2-10)。切割数必须是正整数,非数字或小数会导致 parseInt/Number 解析异常,工具可能无响应或输出错误切片数。
在手机浏览器中长按切片预览图,选择“保存图片”,实际保存的是原图。点击“下载全部”按钮打包下载所有切片,或使用桌面端右键“另存为”单独保存。部分移动端浏览器对 canvas 生成的 Blob URL 长按行为不一致,可能回退到原始图片资源。建议使用工具提供的下载按钮。
上传一张 8000×8000 像素的 4K 壁纸,浏览器标签页直接卡死或闪退。将图片缩小到 2000×2000 以内再上传,或使用图片压缩工具预处理。九宫格切图完全在浏览器本地处理,大图解码和分割会占用大量内存(原图 4 倍以上),超出浏览器单个标签页的内存限制(通常 1-2GB)会导致崩溃。
下载切片后直接按文件名顺序(如 1.jpg, 2.jpg...)发到朋友圈,结果九宫格拼图错位。按工具生成的预览顺序(通常从左到右、从上到下)依次上传,或使用工具提供的“按顺序编号”文件名。朋友圈上传图片时会按选择顺序排列,而非文件名排序。如果手动打乱顺序上传,九宫格拼接效果会完全错乱。
公式推导 · 流程图解 · 依据出处
W = ceil(W_original / N) × N, H = ceil(H_original / N) × N
W_original — 原始图片宽度(像素)H_original — 原始图片高度(像素)N — 宫格行列数(如 3 表示 3×3)W — 扩展后图片宽度(像素)H — 扩展后图片高度(像素)原始图片 1080×800 像素,切 3×3 宫格(N=3)。W = ceil(1080/3)×3 = 360×3 = 1080,H = ceil(800/3)×3 = 267×3 = 801。图片被扩展为 1080×801 像素,再均分为 9 张 360×267 像素的小图。
适用于任意 N×N 宫格(N≥2)。当原始图片尺寸不能被 N 整除时,工具自动在边缘补白/拉伸至整除尺寸。不适用于非正方形宫格(如 2×3)或单张原图直接输出(无切分需求)。
3 种主流语言 · 复制即用
from PIL import Image
import os
# 将一张图片切割为 NxN 宫格(默认 3x3)
def split_grid(image_path, output_dir, grid=(3, 3)):
img = Image.open(image_path)
cols, rows = grid
w, h = img.size
cell_w, cell_h = w // cols, h // rows
os.makedirs(output_dir, exist_ok=True)
for row in range(rows):
for col in range(cols):
left = col * cell_w
upper = row * cell_h
right = (col + 1) * cell_w if col < cols - 1 else w
lower = (row + 1) * cell_h if row < rows - 1 else h
cell = img.crop((left, upper, right, lower))
cell.save(f"{output_dir}/piece_{row}_{col}.png")
split_grid("input.jpg", "output/", (3, 3))package main
import (
"image"
"image/jpeg"
"image/png"
"os"
"path/filepath"
"strconv"
)
func splitGrid(srcPath, dstDir string, cols, rows int) error {
f, _ := os.Open(srcPath)
defer f.Close()
src, _, _ := image.Decode(f)
bounds := src.Bounds()
w, h := bounds.Dx(), bounds.Dy()
cellW, cellH := w/cols, h/rows
os.MkdirAll(dstDir, 0755)
for r := 0; r < rows; r++ {
for c := 0; c < cols; c++ {
rect := image.Rect(c*cellW, r*cellH, (c+1)*cellW, (r+1)*cellH)
piece := src.(interface {
SubImage(r image.Rectangle) image.Image
}).SubImage(rect)
out, _ := os.Create(filepath.Join(dstDir, "piece_"+strconv.Itoa(r)+"_"+strconv.Itoa(c)+".png"))
png.Encode(out, piece)
out.Close()
}
}
return nil
}
func main() {
splitGrid("input.jpg", "output", 3, 3)
}const sharp = require('sharp');
const path = require('path');
const fs = require('fs');
// 使用 sharp 切割图片为 NxN 宫格
async function splitGrid(inputPath, outputDir, cols = 3, rows = 3) {
const meta = await sharp(inputPath).metadata();
const w = meta.width, h = meta.height;
const cellW = Math.floor(w / cols), cellH = Math.floor(h / rows);
fs.mkdirSync(outputDir, { recursive: true });
for (let r = 0; r < rows; r++) {
for (let c = 0; c < cols; c++) {
const left = c * cellW, top = r * cellH;
const extractWidth = (c === cols - 1) ? w - left : cellW;
const extractHeight = (r === rows - 1) ? h - top : cellH;
await sharp(inputPath)
.extract({ left, top, width: extractWidth, height: extractHeight })
.toFile(path.join(outputDir, `piece_${r}_${c}.png`));
}
}
}
splitGrid('input.jpg', 'output', 3, 3).catch(console.error);9 个高频疑问