首页 > 代码库 > Libgdx: 将Texturepacker打包的PNG图片还原成一张一张的单个的

Libgdx: 将Texturepacker打包的PNG图片还原成一张一张的单个的

你是否发现用Texturepacker在打包压缩资源文件之后。把原稿文件弄丢了,但是又要增加新的小png的时候,却无从下手了,本文就是博主在遇到这个问题后百度了很多方法,可惜只有plist格式的方法,libgdx的几乎没有。反正我是没找到,于是自己就写了一个。

打包生成的有两个文件

一个是**.txt  一个是**.png(有些不是txt是.pack 只要内容一样就行,你用记事本打开看看)

其中txt记录位置等参数信息. png是一张大图

card.png
format: RGBA8888
filter: Linear,Linear
repeat: none
c36
  rotate: false
  xy: 2, 550
  size: 63, 86
  orig: 63, 86
  offset: 0, 0
  index: -1
btn1
  rotate: false
  xy: 644, 2
  size: 156, 57
  orig: 156, 57
  offset: 0, 0
  index: -1
c41
  rotate: false
  xy: 392, 550
  size: 63, 86
  orig: 63, 86
  offset: 0, 0
  index: -1

上面是位置信息文件。

下面用java根据这个文件将大图还原成小图

public static void toPNG(String pathTxt,String pathPNG,String OUT)
	{
		ArrayList<String> name=new ArrayList<String>();
		ArrayList<String> xy=new ArrayList<String>();
		ArrayList<String> size=new ArrayList<String>();
		try {
			String encoding = "GBK";
			File file = new File(pathTxt);
			if (file.isFile() && file.exists()) { // 判断文件是否存在
				InputStreamReader read = new InputStreamReader(
						new FileInputStream(file), encoding);// 考虑到编码格式
				BufferedReader bufferedReader = new BufferedReader(read);
				String lineTxt = null;
				int lineNum=0,lineNum2=0;
				while ((lineTxt = bufferedReader.readLine()) != null) {
					lineNum++;
					if(lineNum2>0)
						lineNum2++;
					if(lineNum==5)
						lineNum2=1;
					if(lineNum%7==5)
						name.add(lineTxt);
					if(lineNum2%7==3)
						xy.add(lineTxt);
					if(lineNum2%7==4)
						size.add(lineTxt);			
				}
				read.close();
			} else {
				System.out.println("找不到指定的文件");
			}
			BufferedImage image = (BufferedImage)ImageIO.read(new File(pathPNG));
			for(int i=0;i<name.size();i++)
			{
				String p1=name.get(i),p2=xy.get(i),p3=size.get(i);
			
				int x=0,y=0,w=0,h=0,flag=0;
				for(int j=0;j<p2.length();j++)
				{
					if(p2.charAt(j)<='9' && p2.charAt(j)>='0' )
					{
						if(flag==0)
						{
							x=x*10+p2.charAt(j)-'0';
						}
						else
						{
							y=y*10+p2.charAt(j)-'0';
						}
					}
					if(p2.charAt(j)==',')
						flag=1;
					
				}
				flag=0;
				for(int j=0;j<p3.length();j++)
				{
					if(p3.charAt(j)<='9' && p3.charAt(j)>='0' )
					{
						if(flag==0)
							w=w*10+p3.charAt(j)-'0';
						else
							h=h*10+p3.charAt(j)-'0';
					}
					if(p3.charAt(j)==',')
						flag=1;
					
				}
				
				File f=new File(OUT);
				if(!f.exists())
					f.mkdirs();
				ImageIO.write(image.getSubimage(x,y,w,h),"png",new FileOutputStream(OUT+"/"+p1+".png"));
				System.out.println(p1+":finished");
			}
			
		} catch (Exception e) {
			System.out.println("读取文件内容出错");
			e.printStackTrace();
		}
		
	}
本文原创网址转载必须注明:http://blog.csdn.net/cq361106306/article/details/38036737
使用方法。直接调用

toPNG("d:/card.txt","d:/card.png","d:/s");
第一个参数是文本参数文件,不一定是txt后缀。不同软件生成不一样,只要用记事本打开内容跟上面那个txt一样就行。

第二个参数是大图文件

第三个参数是输出的地方。最后面不要再加"/"了;路径是自动创建的

我这里是测试成功的。如有疑问请留言

打个小广告

我的斗地主APP 请大家支持。 支持单机双人三人联机、

叫做 Wifi斗地主

地址点击打开链接http://www.wandoujia.com/apps/com.hj.joker



Libgdx: 将Texturepacker打包的PNG图片还原成一张一张的单个的