Lua+ImageMagickで簡単に一括ショット
2209 ワード
最近androidの携帯ゲームを作るつもりですが、手元に画像の資源がないので、既製のものを探して先に使いたいと思っています.いくつかのapkをダウンロードして圧縮ツールで解凍して適当な画像を見つけたが、これらの画像の多くは複数の小さな図を1枚の大きな図につなぎ、手動で図を削るのは頼りにならないので、ImageMagickを考えて、それから器用なLuaに合わせて簡単になった.
リソースディレクトリに大きな図とセットになっているものを見つけた.plistプロファイルには、このような構成がたくさんあります.
ここでtextureRectに記録されているのは、小さな図の大きな図のrectです.Luaの正規表現を使って抽出し、ImageMagickのconvert-cropコマンドを使って大きな図のこの領域をほじくり出せばいいのです.完全なLuaコードは次のとおりです.
切り取った小さな図はimagesディレクトリに格納されます(ない場合は手動で作成する必要があります).
リソースディレクトリに大きな図とセットになっているものを見つけた.plistプロファイルには、このような構成がたくさんあります.
<key>cursor.png</key>
<dict>
<key>aliases</key>
<array>
</array>
<key>spriteColorRect</key>
<string>{{0, 0}, {84, 85}}</string>
<key>spriteOffset</key>
<string>{0, -0}</string>
<key>spriteSize</key>
<string>{84, 85}</string>
<key>spriteSourceSize</key>
<string>{84, 85}</string>
<key>spriteTrimmed</key>
<true/>
<key>textureRect</key>
<string>{{943, 172}, {84, 85}}</string>
<key>textureRotated</key>
<false/>
</dict>
ここでtextureRectに記録されているのは、小さな図の大きな図のrectです.Luaの正規表現を使って抽出し、ImageMagickのconvert-cropコマンドを使って大きな図のこの領域をほじくり出せばいいのです.完全なLuaコードは次のとおりです.
local plist_file = io.open("imgAll.plist", "r");
local plist_content = plist_file:read("*a");
plist_file:close();
if plist_content then
local images = {};
local pattern = "<key>(.-)</key>(.-)<key>textureRect</key>(.-)<string>{{(%d+), (%d+)}, {(%d+), (%d+)}}</string>(.-)</dict>";
for key, _, _, x, y, w, h in string.gmatch(plist_content, pattern) do
if not images[key] then
images[key] = {x, y, w, h};
else
print("duplicate key: " .. key);
end
end
for k, v in pairs(images) do
local file_name = string.lower(k);
if string.sub(file_name, -4) ~= ".png" then
file_name = file_name .. ".png";
end
local crop_cmd = string.format([["D:\Program Files\ImageMagick-6.8.5-Q16\convert.exe" imgAll.png -crop %dx%d+%d+%d images\%s]], v[3], v[4], v[1], v[2], file_name);
os.execute(crop_cmd);
end
end
切り取った小さな図はimagesディレクトリに格納されます(ない場合は手動で作成する必要があります).