原地址: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文件形如:

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

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

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

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

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

用unity3d切割图片的更多相关文章

  1. unity 内存中切割图片

    一般的说我们切割图片是将一张图片资源切割成更小的图片资源,也就是说在资源上就进行了切割,比如ugui上的切割方法. 如果我们有一些情况比如做拼图,可能让玩家自己选择自己的生活照作为拼图的原图. 那么我 ...

  2. 两种方法实现用CSS切割图片只取图片中一部分

    切割图片这里不是真正的切割,只是用CSS取图片中的一部分而已,主要有两种方式,一是做为某一元素的背景图片,二是用img元素的属性.下面有个不错的示例,大家可以参考下 切割图片这里不是真正的切割,只是用 ...

  3. 实现用CSS切割图片的方法

    切割图片这里不是真正的切割,只是用CSS取图片中的一部分而已.这样做的好处就是减少了打开网页时请求图片的次数.主要有两种方式,一是做为某一元素的背景图片,二是用img元素的属性. 方法一: 用CSS中 ...

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

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

  5. Android下利用Bitmap切割图片

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

  6. C#实现自动切割图片

    由于做一个TD游戏需要一些图片素材,可是现有的从网上下载的<保卫萝卜>的图片资源是多张图片合在一起的,并且没有什么规则,虽然有 个xml文件似乎用来描述此图片内子图片位置大小等信息,但由于 ...

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

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

  8. iOS 切割图片

    - (UIImage *)CutImageWithImage:(UIImage *)image withRect:(CGRect)rect { //使用CGImageCreateWithImageIn ...

  9. Android 中通过切割图片创建人物行走动画

    以前一直使用序列图片来实现动画效果,造成空间的极大浪费,所以想要尝试下切割图片来实现动画. 如图所示,是由66rpg纸娃娃系统生成的角色行走图.本程序必须实现将人物的整体图片切割后存入4x4的数组来动 ...

随机推荐

  1. 几个很好的OJ网站

    很友好的OJ网站(OJ是open judge,在线评测) POJ 北京大学ACM ZOJ 浙江大学ACM WOJ  武汉大学ACM(一个题目提交通过后,可以查看通过该题的所有代码) 唯一不好的地方是题 ...

  2. redis使用管道pipeline提升批量操作性能(php演示)

    Redis是一个TCP服务器,支持请求/响应协议. 在Redis中,请求通过以下步骤完成: 客户端向服务器发送查询,并从套接字读取,通常以阻塞的方式,用于服务器响应. 服务器处理命令并将响应发送回客户 ...

  3. [libGDX游戏开发教程]使用Libgdx进行游戏开发(5)-关卡加载

    在上一章我们介绍了如何管理和利用素材,但是我们注意到,这些素材都是零散的,比如岩石的左部等,这一章,我们将利用这些零件拼合成完整的游戏对象. 回顾最开始的设计类图,注意Level类和所有Level中的 ...

  4. flutter演示项目:游侠客户端

    使用flutter实现的游侠客户端. 还有一些页面没写,最主要的问题是无法解析html富文本. https://github.com/axel10/flutter_ali213_client_demo

  5. Linux 下 UltraEdit 版本 破解 30 天试用限制

    原创 http://yhz61010.iteye.com/blog/2319599 rm -rfd ~/.idm/uex rm -rf ~/.idm/*.spl rm -rf /tmp/*.spl 一 ...

  6. jQuery.Easyui 三层菜单的实现

    有图才有真相: 三层导航菜单JSON 数据格式如下: ].panel('options').title;    $('#wnav').accordion('select', t); } // 初始化左 ...

  7. HDU 1233.还是畅通工程-最小生成树(Prime)

    还是畅通工程 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Subm ...

  8. Codeforces 810 A.Straight «A»

    A. Straight «A»   time limit per test 1 second memory limit per test 256 megabytes input standard in ...

  9. 如何破解Webstorm 2016.2

    嗯,随着Webstorm2016.2的推出,网上的很多破解方法已经不能用了,不过功夫不负有心人,我终于查到了新的方法, 选择“license server” 输入:http://114.215.133 ...

  10. Jenkins一个任务下载多个git库代码

    公司的项目是微服务架构,一个服务对应的一个git仓库,现在的需求时拉取所有仓库代码下来,指定父级的pom.xml,一次性构建打包 jenkins在默认情况下,一个任务只能配置一个git仓库地址 1.安 ...