用unity3d切割图片
原地址: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="" YPos="" Width="" Height="" />
<Image Name="photo" XPos="" YPos="" Width="" Height="" />
<Image Name="sumbit" XPos="" YPos="" Width="" Height="" />
</Imageset>
复制代码
接着依次做的事情有:解析XML文件,新建Texture2D,根据XML的信息遍历制定的区域,获取指定区域的像素RGBA值,RGBA赋值给Texture2D,保存到当前工程的某一目录中。 复制代码
using UnityEngine;
using System;
using System.Collections;
using System.Xml;
using System.IO; public class ClipPic : MonoBehaviour { Texture2D newTexture;
public Texture2D resTexture;
Color color; string picName;
int picPos_x,picPos_y;
int picWidth,picHeight; // Use this for initialization
void Start () {
XmlDocument xmlDoc = new XmlDocument();
string xml = Resources.Load("test").ToString();
xmlDoc.LoadXml(xml);
XmlNode xn = xmlDoc.SelectSingleNode("Imageset");
XmlNodeList xnl = xn.ChildNodes;
foreach (XmlNode xnf in xnl)
{
XmlElement xe = (XmlElement)xnf;
// Debug.Log("Name=" + xe.GetAttribute("Name"));
// Debug.Log("\t");
// Debug.Log("xpos=" + xe.GetAttribute("XPos"));
// Debug.Log("\t");
// Debug.Log("ypos=" + xe.GetAttribute("YPos"));
// Debug.Log("\t");
// Debug.Log("width=" + xe.GetAttribute("Width"));
// Debug.Log("\t");
// Debug.Log("height=" + xe.GetAttribute("Height"));
picName = xe.GetAttribute("Name");
picPos_x = Convert.ToInt32(xe.GetAttribute("XPos"));
picPos_y = Convert.ToInt32(xe.GetAttribute("YPos"));
picWidth = Convert.ToInt32(xe.GetAttribute("Width"));
picHeight = Convert.ToInt32(xe.GetAttribute("Height"));
newTexture = new Texture2D(picWidth,picHeight);
for(int m=picPos_y;m<picPos_y+picHeight;++m)
{
for(int n=picPos_x;n<picPos_x+picWidth;++n)
{
color = resTexture.GetPixel(n,resTexture.height-m);
newTexture.SetPixel(n-picPos_x,picHeight-(m-picPos_y),color);
}
}
newTexture.Apply();
byte[] b = newTexture.EncodeToPNG();
File.WriteAllBytes("Assets/Resources/out/"+picName+".png",b);
} } }
复制代码
PS:图片坐标原点不同,CEImagesetEditor在图片左上角;Unity3d在图片左下角。
用unity3d切割图片的更多相关文章
- unity 内存中切割图片
一般的说我们切割图片是将一张图片资源切割成更小的图片资源,也就是说在资源上就进行了切割,比如ugui上的切割方法. 如果我们有一些情况比如做拼图,可能让玩家自己选择自己的生活照作为拼图的原图. 那么我 ...
- 两种方法实现用CSS切割图片只取图片中一部分
切割图片这里不是真正的切割,只是用CSS取图片中的一部分而已,主要有两种方式,一是做为某一元素的背景图片,二是用img元素的属性.下面有个不错的示例,大家可以参考下 切割图片这里不是真正的切割,只是用 ...
- 实现用CSS切割图片的方法
切割图片这里不是真正的切割,只是用CSS取图片中的一部分而已.这样做的好处就是减少了打开网页时请求图片的次数.主要有两种方式,一是做为某一元素的背景图片,二是用img元素的属性. 方法一: 用CSS中 ...
- Android调用相册拍照控件实现系统控件缩放切割图片
android 下如果做处理图片的软件 可以调用系统的控件 实现缩放切割图片 非常好的效果 今天写了一个demo分享给大家 package cn.m15.test; import java.io.By ...
- Android下利用Bitmap切割图片
在自己自定义的一个组件中由于需要用图片显示数字编号,而当前图片就只有一张,上面有0-9是个数字,于是不得不考虑将其中一个个的数字切割下来,需要显示什么数字,只需要组合一下就好了. 下面是程序的关键代码 ...
- C#实现自动切割图片
由于做一个TD游戏需要一些图片素材,可是现有的从网上下载的<保卫萝卜>的图片资源是多张图片合在一起的,并且没有什么规则,虽然有 个xml文件似乎用来描述此图片内子图片位置大小等信息,但由于 ...
- Android 调用相册 拍照 实现系统控件缩放 切割图片
android 下如果做处理图片的软件 可以调用系统的控件 实现缩放切割图片 非常好的效果 今天写了一个demo分享给大家. package cn.m15.test; import java.io.B ...
- iOS 切割图片
- (UIImage *)CutImageWithImage:(UIImage *)image withRect:(CGRect)rect { //使用CGImageCreateWithImageIn ...
- Android 中通过切割图片创建人物行走动画
以前一直使用序列图片来实现动画效果,造成空间的极大浪费,所以想要尝试下切割图片来实现动画. 如图所示,是由66rpg纸娃娃系统生成的角色行走图.本程序必须实现将人物的整体图片切割后存入4x4的数组来动 ...
随机推荐
- Delphi指针详解
Delphi指针详解2007-12-04 06:08:57| 分类: DLL学习 阅读91 评论0 字号:大中小 订阅 大家都认为,C语言之所以强大,以及其自由性,很大部分体现在其灵活的指针运用 ...
- laravel自定义公共函数
1.在app/Helpers/下新建一个文件functions.php,当然这个文件位置和名称你可以自己定义,创建一些函数用于全局调用: 2.在composer.json中的autoload下增加如下 ...
- C#关于log4net(Log For Net)
1 介绍 log4net(Log For Net)是Apache开源的应用于.Net框架的日志记录工具,详细信息参见Apache网站.它是针对Java的log4j(Log For Java ...
- 【mysql】使数据表ID连续的两个方法
经常有一些完美主义者问我,怎么让数据库的自增字段在记录被删除时重置它们的顺序,这里不去讨论这么折腾是否真有必要,只说说解决方法,有这方面需求的朋友不妨看看. 方法1.删除自增字段,然后重建(缺点就是必 ...
- (3)webApi postman使用
https://www.getpostman.com/
- 树链剖分【p4116】Qtree3 - Query on a tree
Description 给出N个点的一棵树(N-1条边),节点有白有黑,初始全为白 有两种操作: 0 i : 改变某点的颜色(原来是黑的变白,原来是白的变黑) 1 v : 询问1到v的路径上的第一个黑 ...
- 礼物(BFS)
礼物 时间限制: 1 Sec 内存限制: 64 MB提交: 39 解决: 4[提交][状态][讨论版] 题目描述 给出一个n行m列的点阵,“.”表示可通行格子,“#”表示不可通行格子,“K”表示国 ...
- 最小生成树(Kruskal)(并查集)
最小生成树 时间限制: 1 Sec 内存限制: 64 MB提交: 11 解决: 2[提交][状态][讨论版] 题目描述 某个宇宙帝国有N个星球,由于宇宙的空间是三维的,因此每个星球的位置可以用三维 ...
- 小程序使用npm模块(引入第三方UI),报错的多种解决办法。
前言引入第三方模块时,我遇到了很多坑. 首先是微信.第三方模块的文档描述不清楚.其次.搜索到的博客,大部分是抄的文档 / 相互转载抄袭.作用有限. 于是,我自己做了各种条件下的测试.解决各种情况的引入 ...
- 【Ubuntu】使用root账户登录ubuntu
由于经常使用,所以写个博客记下来以便后来查看. 1.修改root账户密码:sudo passwd root,输密码 2.修改/usr/share/lightdm/lightdm.conf.d/50-u ...