Aseprite 中文文档 下载 App

批处理导出|一行命令搞定几十个文件的 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
}

注意事项