原地址:http://www.cnblogs.com/leng-yuye/archive/2012/05/31/2528148.html

需求:把图片的像素中不为alpha的部分切出来保存成单个图片。

之前打算用Texture2D.GetPixel()遍历整张图片,判断每一个像素的alpha是否为0,接着对每一个像素判断是否为临界的像素点,最后用new一个Texture2D用Texture2D.SetPixel()赋值像素的RGBA。但是存在一种特殊的情况,那就是想要截取的图片中有alpha=0的时候,这个方法就蛋疼了。于是乎又另图思路,结合CEImagesetEditor这个开源的工具来完成这个工作,虽然这种方法不够"智能",但是截取的很准确。

用CEImagesetEditor工具定位要截取的位置和大小后能生成一个XML文件,这个文件包含要截取图片的名字、位置以及大小。XML文件形如:

<?xml version="1.0" encoding="UTF-8"?><Imageset Name="test" Imagefile="test\roomlist.tga" ><Image Name="name" XPos="190" YPos="59" Width="60" Height="25" /><Image Name="photo" XPos="32" YPos="48" Width="127" Height="206" /><Image Name="sumbit" XPos="55" YPos="264" Width="65" Height="38" />
</Imageset>

接着依次做的事情有:解析XML文件,新建Texture2D,根据XML的信息遍历制定的区域,获取指定区域的像素RGBA值,RGBA赋值给Texture2D,保存到当前工程的某一目录中。

 1 using UnityEngine;2 using System;3 using System.Collections;4 using System.Xml;5 using System.IO;6 7 public class ClipPic : MonoBehaviour {8     9     Texture2D newTexture;
10     public Texture2D resTexture;
11     Color color;
12
13     string picName;
14     int picPos_x,picPos_y;
15     int picWidth,picHeight;
16
17
18     // Use this for initialization
19     void Start () {
20         XmlDocument xmlDoc = new XmlDocument();
21         string xml = Resources.Load("test").ToString();
22         xmlDoc.LoadXml(xml);
23         XmlNode xn = xmlDoc.SelectSingleNode("Imageset");
24         XmlNodeList xnl = xn.ChildNodes;
25         foreach (XmlNode xnf in xnl)
26         {
27             XmlElement xe = (XmlElement)xnf;
28 //            Debug.Log("Name=" + xe.GetAttribute("Name"));
29 //            Debug.Log("\t");
30 //            Debug.Log("xpos=" + xe.GetAttribute("XPos"));
31 //            Debug.Log("\t");
32 //            Debug.Log("ypos=" + xe.GetAttribute("YPos"));
33 //            Debug.Log("\t");
34 //            Debug.Log("width=" + xe.GetAttribute("Width"));
35 //            Debug.Log("\t");
36 //            Debug.Log("height=" + xe.GetAttribute("Height"));
37             picName = xe.GetAttribute("Name");
38             picPos_x = Convert.ToInt32(xe.GetAttribute("XPos"));
39             picPos_y = Convert.ToInt32(xe.GetAttribute("YPos"));
40             picWidth = Convert.ToInt32(xe.GetAttribute("Width"));
41             picHeight = Convert.ToInt32(xe.GetAttribute("Height"));
42             newTexture = new Texture2D(picWidth,picHeight);
43             for(int m=picPos_y;m<picPos_y+picHeight;++m)
44             {
45                 for(int n=picPos_x;n<picPos_x+picWidth;++n)
46                 {
47                     color = resTexture.GetPixel(n,resTexture.height-m);
48                     newTexture.SetPixel(n-picPos_x,picHeight-(m-picPos_y),color);
49                 }
50             }
51             newTexture.Apply();
52             byte[] b = newTexture.EncodeToPNG();
53             File.WriteAllBytes("Assets/Resources/out/"+picName+".png",b);
54         }
55
56     }
57
58 }

PS:图片坐标原点不同,CEImagesetEditor在图片左上角;Unity3d在图片左下角。

需求:把图片的像素中不为alpha的部分切出来保存成单个图片。之前打算用Texture2D.GetPixel()遍历整张图片,判断每一个像素的alpha是否为0,接着对每一个像素判断是否为临界的像素点,最后用new一个Texture2D用Texture2D.SetPixel()赋值像素的RGBA。但是存在一种特殊的情况,那就是想要截取的图片中有alpha=0的时候,这个方法就蛋疼了。于是乎又另图思路,结合CEImagesetEditor这个开源的工具来完成这个工作,虽然这种方法不够"智能",但是截取的很准确。用CEImagesetEditor工具定位要截取的位置和大小后能生成一个XML文件,这个文件包含要截取图片的名字、位置以及大小。XML文件形如:复制代码
<?xml version="1.0" encoding="UTF-8"?><Imageset Name="test" Imagefile="test\roomlist.tga" ><Image Name="name" XPos="190" YPos="59" Width="60" Height="25" /><Image Name="photo" XPos="32" YPos="48" Width="127" Height="206" /><Image Name="sumbit" XPos="55" YPos="264" Width="65" Height="38" />
</Imageset>
复制代码
接着依次做的事情有:解析XML文件,新建Texture2D,根据XML的信息遍历制定的区域,获取指定区域的像素RGBA值,RGBA赋值给Texture2D,保存到当前工程的某一目录中。复制代码1 using UnityEngine;2 using System;3 using System.Collections;4 using System.Xml;5 using System.IO;6 7 public class ClipPic : MonoBehaviour {8     9     Texture2D newTexture;
10     public Texture2D resTexture;
11     Color color;
12
13     string picName;
14     int picPos_x,picPos_y;
15     int picWidth,picHeight;
16
17
18     // Use this for initialization
19     void Start () {
20         XmlDocument xmlDoc = new XmlDocument();
21         string xml = Resources.Load("test").ToString();
22         xmlDoc.LoadXml(xml);
23         XmlNode xn = xmlDoc.SelectSingleNode("Imageset");
24         XmlNodeList xnl = xn.ChildNodes;
25         foreach (XmlNode xnf in xnl)
26         {
27             XmlElement xe = (XmlElement)xnf;
28 //            Debug.Log("Name=" + xe.GetAttribute("Name"));
29 //            Debug.Log("\t");
30 //            Debug.Log("xpos=" + xe.GetAttribute("XPos"));
31 //            Debug.Log("\t");
32 //            Debug.Log("ypos=" + xe.GetAttribute("YPos"));
33 //            Debug.Log("\t");
34 //            Debug.Log("width=" + xe.GetAttribute("Width"));
35 //            Debug.Log("\t");
36 //            Debug.Log("height=" + xe.GetAttribute("Height"));
37             picName = xe.GetAttribute("Name");
38             picPos_x = Convert.ToInt32(xe.GetAttribute("XPos"));
39             picPos_y = Convert.ToInt32(xe.GetAttribute("YPos"));
40             picWidth = Convert.ToInt32(xe.GetAttribute("Width"));
41             picHeight = Convert.ToInt32(xe.GetAttribute("Height"));
42             newTexture = new Texture2D(picWidth,picHeight);
43             for(int m=picPos_y;m<picPos_y+picHeight;++m)
44             {
45                 for(int n=picPos_x;n<picPos_x+picWidth;++n)
46                 {
47                     color = resTexture.GetPixel(n,resTexture.height-m);
48                     newTexture.SetPixel(n-picPos_x,picHeight-(m-picPos_y),color);
49                 }
50             }
51             newTexture.Apply();
52             byte[] b = newTexture.EncodeToPNG();
53             File.WriteAllBytes("Assets/Resources/out/"+picName+".png",b);
54         }
55
56     }
57
58 }
复制代码PS:图片坐标原点不同,CEImagesetEditor在图片左上角;Unity3d在图片左下角。

用unity3d切割图片相关推荐

  1. python语言编写一个生成九宫格图片的代码_Python切割图片成九宫格的示例代码

    这篇文字讲述如何使用Python把一张完整的大图切割成9份小图片,制作朋友圈九宫格图文分享. 原图如下: 我们想要利用这张图制作高逼格的九宫格朋友圈分享. 达到类似于这样的效果: 实现原理非常简单,那 ...

  2. Android 调用相册 拍照 实现系统控件缩放 切割图片

    android 下如果做处理图片的软件 可以调用系统的控件 实现缩放切割图片 非常好的效果 今天写了一个demo分享给大家. package cn.m15.test;import java.io.By ...

  3. Android下利用Bitmap切割图片

    在自己自定义的一个组件中由于需要用图片显示数字编号,而当前图片就只有一张,上面有0-9是个数字,于是不得不考虑将其中一个个的数字切割下来,需要显示什么数字,只需要组合一下就好了. 下面是程序的关键代码 ...

  4. Fresco 二三事:图片处理之旋转、缩放、裁剪切割图片

    关于Fresco加载图片的处理,例如旋转.裁剪切割图片,在官方文档也都有提到,只是感觉写的不太详细,正好最近项目里有类似需求,所以分享一些使用小tip,后面的朋友就不用再走弯路浪费时间了.(测试图片分 ...

  5. java以目标尺寸按原图片像素比缩放切割图片

    2019独角兽企业重金招聘Python工程师标准>>> 需求:原始图片缩放为目标尺寸后,要求缩放后的图片保持原图片的样式不改变,但是缩放后图片的四边可以裁减. 原理:将待裁剪图片宽高 ...

  6. java中如何切割图片_Java 切割图片代码

    Java 切割图片代码 (2012-09-04 10:39:48) 标签: 宽度 切割 源文件 工具类 java package com.lyis.commons.util; import java. ...

  7. python 切割图_python切割图片的示例

    这个小程序可以自己设定行数和列数进行图片切割 import os from PIL import Image def splitimage(src, rownum, colnum, dstpath): ...

  8. Android 切割图片

    public class ImagePiece { public int index = 0; public Bitmap bitmap = null;   } /**      * 切割图片    ...

  9. css大图切割,利用CSS切割图片技术来动态显示图片

    利用CSS切割图片来切换图片 .img2 { position:absolute; clip:rect(0px 20px 20px 0px); } .img1 { position:absolute; ...

最新文章

  1. redis-deskmanager 连不上 虚拟机 - centos redis
  2. C++拷贝构造函数详解
  3. boost之asio同步io使用实例
  4. 推荐一位BAT数据大神!(附联系方式)
  5. 11.05T3 map
  6. linux进行硬盘分区挂载-了解系统,最更好的开发
  7. SAP Client Copy
  8. 检测移动端设备信息 (手机品牌、系统版本等 或 PC
  9. 新华三:照耀城市的数字演进之路
  10. 2022-2027年中国开采沙石行业发展监测及投资战略研究报告
  11. 双月学习OKR(67月)
  12. 启动tomcat闪退如何获取报错信息
  13. 基于Sequoia DB巨杉数据库的投资组合评比器(设计思路)
  14. 怎么判断数字n是否为2的x次方,即2的幂次呢,比如2,4,8,16,32
  15. 用开源代码如何建立网站_建立更可插拔的开源文化
  16. HFSS 3D LAOUT PCB 裁剪,差分线,过孔仿真和优化
  17. 中学计算机竞赛教程,全国中小学信息技术课程教学大赛获奖案例初中信息技术八年级-设置自定义动画动作路径...
  18. python就业需要的技能_教你如何快速掌握Python就业技能
  19. 成功解决win10系统右键点击文件夹没反应(一直显示转圈圈)图文教程手把手解决搞定!
  20. 如何用现在的大数据分析和人工智能技术来研究和论证翁文波先生的可公度性预测理论?

热门文章

  1. C语言基础教程之enum
  2. loj10131 暗的连锁
  3. Java的Redis连接池代码
  4. 在Objective-C中浅谈面向对象
  5. 网络广告假流量盛行,查处有妙招
  6. RHEL6入门系列之三十一,管理计划任务
  7. 有商在线进销存成功案例
  8. lombok几个基本注解的使用@Data @AllArgsConstructor @NoArgsConstructor @Builder
  9. 【同124】LeetCode 687. Longest Univalue Path
  10. 剑指offer——面试题44:扑克牌顺子