解压libGDX引擎.atlas或者.txt图集文件

最近学习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的文件怎么运行、这个我就不加累述了。

 

 

转载于:https://my.oschina.net/u/3891480/blog/1833602

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值