最近准备做一个android手机游戏,但是手头没有图片资源,于是就想着找些现成的拿来先用着。下载了一些apk用压缩工具解压出来找到了些比较合适的图片,但这些图片大都是把多张小图拼接到一张大图里,手动去抠图不靠谱,于是想到了 ImageMagick,然后再配合灵巧的 Lua 事情就变得简单多了。
在资源目录找到了个和大图配套的.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