文档章节

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

 小草拌沥青
发布于 2018/06/21 17:29
字数 981
阅读 13
收藏 0

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

 

 

© 著作权归作者所有

粉丝 0
博文 11
码字总数 8748
作品 0
厦门
私信 提问
使用TexturePackerGUI打包unity3d图集的方法

在U3d中,UGUI使用Sprite2D格式,NGUI则需要打包成Atlas图集,使用TexturePackerGUI打包Ngui图集,资源占用较少,性能较高。TexturePacker最终将生成2个文件一个图集文件,一个存放图集中图片...

u014024839
2018/05/24
0
0
android游戏开发框架libgdx的使用(十二)—TiledMap地图的使用

提示:本文记录的是本人的操作流程和心得,各位操作时可能由于版本和其它问题会出现点障碍,请参考本文后面的评论和回复。 虽说可以用Image什么的当个背景,但是要是做个RPG类的游戏就有点复...

长平狐
2013/11/25
262
0
Apache Atlas 0.8.2 发布,数据治理系统

Apache Atlas 0.8.2 发布,该版本包含大量的改进记录以及 Bug 修复: 发布工件内容可以在一下网站找到:http://www.apache.org/dyn/closer.cgi/atlas/0.8.2/ 二进制文件可以从Maven中心及其镜...

周其
2018/02/06
1.3K
0
ubuntu14.04 LTS下Atlas2.2安装说明

准备工作 本文档是在ubuntu14.04下安装2.2版本的atlas。 官方文档很重要,请熟读。 wiki地址:https://github.com/Qihoo360/Atlas/wiki QQ 群:326544838(可以加此群进行咨询) 1.所用软件: ...

凯文加内特
2015/04/16
3K
0
Apache Atlas容错与高可用方案

笔者近期在和团队的小伙伴进行数据资产管理方向的探索,本书的翻译基于Apache Atlas v1.1版本。笔者翻译的《Atlas开发指南(中文版)》地址为: 置顶文章 。希望对大家有帮助,阅读过程中遇到问...

mantoudev
2018/12/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

聊聊artemis的maxDeliveryAttempts

序 本文主要研究一下artemis的maxDeliveryAttempts maxDeliveryAttempts activemq-artemis-2.11.0/artemis-server/src/main/java/org/apache/activemq/artemis/core/settings/impl/AddressSe......

go4it
42分钟前
37
0
heroku - 如何查看所有日志

我在heroku上有一个小应用程序。 每当我想看日志时,我都会去命令行做 heroku logs 这只能让我看到大约100行。 有没有办法在heroku上查看我们的应用程序的完整日志? #1楼 对于雪松堆栈,请...

javail
50分钟前
37
0
Spring AOP 创建增强类

AOP联盟为增强定义了org.aopalliance.aop.Advice接口,Spring支持5种类型的增强: 1)前置增强:org.springframework.aop.BeforeAdvice 代表前置增强,因为Spring 只支持方法级的增强,所有M...

onedotdot
52分钟前
41
0
将.apply()与'new'运算符配合使用。 这可能吗?

在JavaScript中,我想创建一个对象实例(通过new运算符),但是将任意数量的参数传递给构造函数。 这可能吗? 我想做的是这样的(但是下面的代码不起作用): function Something(){ //...

技术盛宴
今天
74
0
世界最大双发客机 波音777X成功首飞

  据外媒报道,美国当地时间 1 月 25 日, 世界上最大的双引擎喷气客机波音 777X 完成首飞,全程 3 小时 51 分钟,从西雅图艾弗雷特佩恩机场起飞,降落在波音机场。   本次飞行将检验飞机...

水果黄瓜
今天
114
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部