• 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 请大家支持。

    支持单机双人三人联机、


    地址  安卓市场   木蚂蚁市场



  • 相关阅读:
    文件进阶
    文件及文件操作
    字符编码
    集合
    数据类型之字典
    数据类型之列表,元组
    数据类型之数字,字符串
    for 循环语句
    while 循环语句
    深浅拷贝
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/5066273.html
Copyright © 2020-2023  润新知