最近学习cocos creator,找游戏开发资源的时候刚好遇到.atlas或.txt的图集文件。
其实不管.atlas还是.txt还是.plist,又或者.json,都是类似的,都是按一定的坐标宽度属性格式去显示图片。
然后自己去网上参考了很多开源和不开源的代码和工具,都不好用。
最后找到一个以python为源码的解压代码,然而这段代码支持的python版本可能太旧了,很多库都不支持,我手动修改了一下这个工具python的源码,支持python3.6
这段代码只支持.atlas和.png的文件名一定要一样,并没有充分利用.atlas里的属性
# -*- coding: utf-8 -*-
#######解压atlas图集工具 初始版 ---By.sujing
########只支持单张图片
import os
import sys
import os.path
import shutil
from PIL import Image
fileName = input('输入要解析的文件名:')
if fileName.find('.png') != -1:
fileName = fileName[:-4]
pngName = fileName + '.png'
atlasName = fileName + '.atlas'
print (pngName, atlasName)
big_image = Image.open(pngName)
atlas = open(atlasName, "r");
curPath = os.getcwd() # 当前路径
aim_path = os.path.join(curPath, fileName)
print (aim_path)
if os.path.isdir(aim_path):
shutil.rmtree(aim_path, True) # 如果有该目录,删除
os.makedirs(aim_path)
#
_line = atlas.readline();
_line = atlas.readline();
_line = atlas.readline();
_line = atlas.readline();
_line = atlas.readline();
_line = atlas.readline();
while True:
line1 = atlas.readline() # name
if len(line1) == 0:
break
else:
line2 = atlas.readline() # rotate
line3 = atlas.readline() # xy
line4 = atlas.readline() # size
line5 = atlas.readline() # orig
line6 = atlas.readline() # offset
line7 = atlas.readline() # index
print(line1,line2,line3,line4,line5,line6,line7)
name = line1.replace("\n", "") + ".png";
args = line4.split(":")[1].split(",");
width = int(args[0])
height = int(args[1])
args = line3.split(":")[1].split(",");
ltx = int(args[0])
lty = int(args[1])
rbx = ltx + width
rby = lty + height
print(name, width, height, ltx, lty, rbx, rby)
result_image = Image.new("RGBA", (width, height), (0, 0, 0, 0))
rect_on_big = big_image.crop((ltx, lty, rbx, rby))
print(rect_on_big)
result_image.paste(rect_on_big, (0, 0, width, height))
result_image.save(aim_path + '/' + name)
atlas.close()
del big_image
在学习的过程中,我发现这个工具并不支持一个.atlas对应多个.png的图集资源。后来我又对这个工具进行了改进,只需输入.atlas的文件路径,就会自动去读取.atlas文件里的图片文件,这和上面的原版工具不同。
# -*- coding: utf-8 -*-
#######解压atlas图集工具 加强版 ---By.sujing
########支持多张图片
import os
import sys
import os.path
import shutil
from PIL import Image
fileName = input('输入要解析的.atlas文件名:')
if fileName.find('.atlas') != -1:
fileName = fileName[:-6]
atlasName = fileName + '.atlas'
atlas = open(atlasName, "r");
curPath = os.getcwd() # 当前路径
aim_path = os.path.join(curPath, fileName)
print (aim_path)
if os.path.isdir(aim_path):
shutil.rmtree(aim_path, True) # 如果有该目录,删除
os.makedirs(aim_path)
def analysis(pngName):
# print(pngName)
pngName = pngName.replace("\n", "");
index = pngName.rfind('/');
if index>-1:
pngName = pngName[index:]
big_image = Image.open(pngName) # 图片名
_line = atlas.readline(); # size: 1016,251
_line = atlas.readline(); # format: RGBA8888
_line = atlas.readline(); # filter: Linear,Linear
_line = atlas.readline(); # repeat: none
while True:
line1 = atlas.readline() # name
index = line1.rfind('/');
if index > -1:
line1 = line1[index:]
if len(line1) == 0:
return
if line1=="\n":
continue
if line1.find('.png') > -1:
analysis(line1)
return
line2 = atlas.readline() # rotate
line3 = atlas.readline() # xy
line4 = atlas.readline() # size
line5 = atlas.readline() # orig
line6 = atlas.readline() # offset
line7 = atlas.readline() # index
print(line1, line2, line3, line4, line5, line6, line7)
name = line1.replace("\n", "") + ".png";
args = line4.split(":")[1].split(",");
width = int(args[0])
height = int(args[1])
args = line3.split(":")[1].split(",");
ltx = int(args[0])
lty = int(args[1])
rbx = ltx + width
rby = lty + height
result_image = Image.new("RGBA", (width, height), (0, 0, 0, 0))
rect_on_big = big_image.crop((ltx, lty, rbx, rby))
result_image.paste(rect_on_big, (0, 0, width, height))
result_image.save(aim_path + '/' + name)
del big_image
def main():
while True:
_line = atlas.readline();
if len(_line) == 0:
break
if _line.find('.png') > -1:
analysis(_line)
main()
atlas.close()
# del big_image
之前并没有深入学习过python,只是基于参考的代码自己修修改改。
这两个版本的代码运行前,必须要把图集资源放在和代码同目录底下运行,由于比较懒,并没有做防报错。
希望可以帮到和我一样需要解压.atlas图集文件的开发者并留作记录。
在运行这段代码前,记得安装python环境,并且pip install Image安装图片库
.py的文件怎么运行、这个我就不加累述了。