批处理导出|一行命令搞定几十个文件的 Sprite Sheet
为什么需要批处理
做一个游戏的像素素材,通常会有几十甚至上百个 Aseprite 文件:主角一套、配角一套、NPC 十几个、怪物一批、UI 素材若干……
如果每个文件都要手动 File → Export → Sprite Sheet → 选布局 → 选 JSON → 保存,上百个文件要花几个小时。而且一旦改了某个角色的动画,还要重新手动导出一遍。
批处理就是用一个 Lua 脚本 + 一行命令,让 Aseprite 无界面地把所有文件跑完。
最常用的场景:批量导出 Sprite Sheet
脚本文件(export-all.lua)
-- 批量把所有 .ase 文件导出为 Sprite Sheet + JSON
-- 用法:aseprite -b --script export-all.lua *.ase
for _, file in ipairs(app.params.files) do
local sprite = app.openFile(file)
if sprite then
local pngName = file:gsub("%.ase$", ".png")
local jsonName = file:gsub("%.ase$", ".json")
app.command.ExportSpriteSheet{
ui=false,
type=SpriteSheetType.GRID,
columns=4,
spriteSheetFilename=pngName,
dataFilename=jsonName,
dataFormat="json-array",
frameWidth=sprite.width,
frameHeight=sprite.height,
padding=0
}
sprite:close()
end
end
命令行运行
aseprite -b --script export-all.lua C:\game-assets\*.ase
这一行命令会把 C:\game-assets 下所有 .ase 文件全部导出成 Sprite Sheet PNG + JSON。几十个文件 → 几秒钟搞定。
更高级:按标签分组导出
-- 按标签分别导出 Sprite Sheet
for _, file in ipairs(app.params.files) do
local sprite = app.openFile(file)
if sprite then
for _, tag in ipairs(sprite.tags) do
local outName = file:gsub("%.ase$", "-" .. tag.name .. ".png")
app.command.ExportSpriteSheet{
ui=false,
type=SpriteSheetType.HORIZONTAL,
spriteSheetFilename=outName,
frameWidth=sprite.width,
frameHeight=sprite.height,
tagName=tag.name
}
end
sprite:close()
end
end
这个脚本会把每个 .ase 文件里的每个标签分别导出成一张 Sprite Sheet——一个角色文件(有 walk / attack / idle 三个标签)会生成三张 Sprite Sheet。
其他批处理场景
批量转换调色板
-- 把所有 .ase 文件的颜色模式转成 Indexed 并限制到 32 色
for _, file in ipairs(app.params.files) do
local sprite = app.openFile(file)
if sprite then
sprite:setColorMode(ColorMode.INDEXED)
sprite.palette:resize(32)
sprite:save()
sprite:close()
end
end
批量统一缩放
-- 把所有 sprite 放大 2 倍(整数倍,Pixel Perfect)
for _, file in ipairs(app.params.files) do
local sprite = app.openFile(file)
if sprite then
sprite:resize(sprite.width * 2, sprite.height * 2)
sprite:save()
sprite:close()
end
end
PowerShell 里的用法
在 Windows PowerShell 里批量处理整个文件夹:
# 导出某个文件夹下所有 .ase 文件
$files = Get-ChildItem "C:\game-assets\characters\*.ase"
aseprite -b --script "C:\scripts\export-all.lua" $files.FullName
# 用 ForEach-Object 更灵活
Get-ChildItem "C:\game-assets\**\*.ase" -Recurse | ForEach-Object {
aseprite -b --script "C:\scripts\export-one.lua" $_.FullName
}
注意事项
- 脚本用 ASCII 字符:Aseprite 命令行对中文路径支持可能不稳定,脚本文件名、输出文件名尽量用英文
- 脚本先在 GUI 里测试:批处理前,先在 Aseprite 界面里 File → Scripts → Run 测试脚本逻辑正确
- 用
-b模式:批处理必须用-b(Batch)标志,否则会打开 GUI 卡住 - 脚本里要 close sprite:处理完一个文件后记得
sprite:close(),否则内存会被吃掉