unity 内存中切割图片
一般的说我们切割图片是将一张图片资源切割成更小的图片资源,也就是说在资源上就进行了切割,比如ugui上的切割方法。
如果我们有一些情况比如做拼图,可能让玩家自己选择自己的生活照作为拼图的原图。
那么我们需要进行在内存中进行切割
Texture2D ScaleTextureCutOut(Texture2D originalTexture, float startX,float startY, float originalWidth, float originalHeight)
{
originalWidth = Mathf.Clamp(originalWidth, , Mathf.Max(originalTexture.width - startX,));
originalHeight = Mathf.Clamp(originalHeight, , Mathf.Max(originalTexture.height - startY,));
Texture2D newTexture = new Texture2D(Mathf.CeilToInt(originalWidth), Mathf.CeilToInt(originalHeight));
int maxX = originalTexture.width - ;
int maxY = originalTexture.height - ;
for (int y = ; y < newTexture.height; y++)
{
for (int x = ; x < newTexture.width; x++)
{
float targetX = x + startX;
float targetY = y + startY;
int x1 = Mathf.Min(maxX, Mathf.FloorToInt(targetX));
int y1 = Mathf.Min(maxY, Mathf.FloorToInt(targetY));
int x2 = Mathf.Min(maxX, x1 + );
int y2 = Mathf.Min(maxY, y1 + ); float u = targetX - x1;
float v = targetY - y1;
float w1 = ( - u) * ( - v);
float w2 = u * ( - v);
float w3 = ( - u) * v;
float w4 = u * v;
Color color1 = originalTexture.GetPixel(x1, y1);
Color color2 = originalTexture.GetPixel(x2, y1);
Color color3 = originalTexture.GetPixel(x1, y2);
Color color4 = originalTexture.GetPixel(x2, y2);
Color color = new Color(Mathf.Clamp01(color1.r * w1 + color2.r * w2 + color3.r * w3 + color4.r * w4),
Mathf.Clamp01(color1.g * w1 + color2.g * w2 + color3.g * w3 + color4.g * w4),
Mathf.Clamp01(color1.b * w1 + color2.b * w2 + color3.b * w3 + color4.b * w4),
Mathf.Clamp01(color1.a * w1 + color2.a * w2 + color3.a * w3 + color4.a * w4)
);
newTexture.SetPixel(x, y, color);
}
}
newTexture.anisoLevel = ;
newTexture.Apply();
return newTexture;
}
这个代码摘自网络上的,然后添加了起始位置,逻辑是将每一个对应点的色素值取出来,放置在内存中的图片点上
今天在做应用的时候发现,图片切割的起始位置是在左下角,于是,在做拼图或者其他游戏,需要的时候要注意进行Y值的换算
还有另外的一点就是所应用的图片如果在unity中的情况,需要勾选允许读取和写入
否则在进行读颜色值的时候会出现错误。
做拼图遇到还有的一个问题是,让玩家选取本地任意地点文件,参考 http://blog.csdn.net/awnuxcvbn/article/details/21277481
后面有发现项目中用到图集,但是原图丢失了,然后在整理图集的时候不是特别方便,把A图集的一项删除之后无法放到B中。于是就需要拆除原图
[MenuItem("Tools/Resume Sprite From Atlas")]
public static void ResumeSpriteFromAtlas()
{
Object[] go = Selection.objects;
for (int i = 0; i < go.Length; i++)
{
if (go[i].GetType() == typeof(GameObject))
{
GameObject resObject = go[i] as GameObject;
UIAtlas resAtlas = resObject.GetComponent<UIAtlas>();
if (resAtlas != null)
{
DecompressAtlas(resAtlas);
}
}
}
} public static void DecompressAtlas(UIAtlas resAtlas)
{
string mainPath = "D://OutSprites/" + resAtlas.name;
if ( !System.IO.Directory.Exists(mainPath) )
{
System.IO.Directory.CreateDirectory(mainPath);
}
Material mainMaterial = resAtlas.spriteMaterial;
Texture2D mainTexture = (Texture2D)mainMaterial.mainTexture;
for(int i = 0; i < resAtlas.spriteList.Count; i++)
{
UISpriteData spData = resAtlas.spriteList[i];
Texture2D newTexture = new Texture2D(spData.width, spData.height);
Color[] needCopy = mainTexture.GetPixels(spData.x, mainTexture.height - (spData.y + spData.height), spData.width, spData.height);
newTexture.SetPixels(0, 0, newTexture.width, newTexture.height, needCopy);
newTexture.Apply();
byte[] pngBytes = newTexture.EncodeToPNG();
string filePath = mainPath + "/" + spData.name + ".png";
Stream st = System.IO.File.Open(filePath, FileMode.OpenOrCreate);
st.Write(pngBytes, 0, pngBytes.Length);
st.Flush();
st.Close();
UnityEngine.Debug.Log(filePath);
}
}
在untiy 编辑器下可以将选中的图集拆出原图,这样就又可以随便组合图集了
unity 内存中切割图片的更多相关文章
- Android内存中的图片
图片在内存中的大小 Android.graphics.Bitmap类里有一个内部类Bitmap.Config类,在Bitmap类里createBitmap(intwidth, int height, ...
- win7(旗舰版)下,OleLoadPicture 加载内存中的图片(MagickGetImageBlob),返回值 < 0
昨天去三哥家,想把拍好的照片缩小一下,我用很久前写的一个软件进行缩小,然后进行一次效果预览,这个时候弹出: Call OleLoadPicture Fail - loadPictureFromMW 奇 ...
- 知道内存中一个图片的指针IntPtr大小,转换成图片显示
//nSize 为总长度//pImageData 为总数据//nImageSize //一个图片的长度 byte[] _bytes = new byte[nImageSize];// //IntPtr ...
- Android 使用ContentProvider扫描手机中的图片,仿微信显示本地图片效果
版权声明:本文为博主原创文章,未经博主允许不得转载. 转载请注明本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/1873 ...
- iOS之在内存中绘图
与直接在UIView控件上绘图不同,在内存中绘图时,需要开发者自己准备绘图环境,Quartz 2D提供了一个非常便捷的函数:UIGraphicsBeginImageContext(CGSize siz ...
- Android高效内存:让图片占用尽可能少的内存
Android高效内存:让图片占用尽可能少的内存 一.让你的图片最小化 1.1 大图小图内存使用情况对比 大图:440 * 336 小图:220 * 168 小图的高宽都是大图的1/2--> ...
- 在 Excel 中设置图片
package com.smbea.demo.excel; import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStr ...
- iOS图片加载到内存中占用内存情况
我的测试结果: 图片占用内存 图片尺寸 .png文件大小 1MB 512*512 316KB 4MB 10 ...
- 两种方法实现用CSS切割图片只取图片中一部分
切割图片这里不是真正的切割,只是用CSS取图片中的一部分而已,主要有两种方式,一是做为某一元素的背景图片,二是用img元素的属性.下面有个不错的示例,大家可以参考下 切割图片这里不是真正的切割,只是用 ...
随机推荐
- sqlite的ef使用小结
最近有一个小项目,老师推荐我用下sqlite这种轻型的数据库来进行数据的存储.轻型数据库具有其独特之处:方便,不用安装特定的软件就能够实用,关于sqlite的优点我不赘述,网上还是有好多资料的. 但我 ...
- iOS开发一个用户登录注册模块需要解决的坑
最近和另外一位同事负责公司登录和用户中心模块的开发工作,开发周期计划两周,减去和产品和接口的协调时间,再减去由于原型图和接口的问题,导致强迫症纠结症状高发,情绪不稳定耗费的时间,能在两周基本完成也算是 ...
- sqlite学习
一鼓作气,今天继续学习了sqlite数据库在Xcode上的一些操作,主要是通过用oc代码进行salite表格的创建,删除,修改:以及对现有的表格数据进行增,删,改,查.虽然有点累,但是收获不小,感觉很 ...
- fcitx 候选词出现奇怪的笔画
原来fcitx还有笔画输入的功能,输入h出现一个横,s出现竖,p是撇,n是捺,z是折. 虽然很有意思,但是不实用,而且还会出现在第一页候选词中,影响输入,可以通过配置文件禁用掉: $ vim ~/.c ...
- centos7 系统初始化脚本
现在自己的本地虚拟机系统,直接安装的是centos7.2 mini版,安装完成发现好多东西都没有安装,所以写了一个简单的系统初始化脚本,让自己可以省一些力气,哈哈 人懒主要是. 下面贴出写的脚本,脚本 ...
- BigDecimal
BigDecimal需要创建对象进行计算(用不同的方式做运算) BigDecimal num1 = new BigDecimal("5"): BigDecimal num2 = n ...
- 安装XAMPP后APACHE不能启动解决方法
自己的xampp中的apache启动失败,在网上找到了一篇文章,感觉不错,原文如下: Xampp的获得和安装都十分简单,你只要到以下网址: http://www.apachefriends.org/z ...
- C#的IPAddress IPEndPoint
以前觉得什么都能记住 翻一遍书就能去考试了,现在回过头来想一些东西,突然有种模糊的陌生感,应了那句好记性不如烂笔头.做笔记终归是利大于弊的.麻烦一点但是却受用. 突然想从头开始,看一些过去的书,补一些 ...
- Quartz定时调度配置
1. CronTrigger时间格式配置说明 CronTrigger配置格式: 格式: [秒] [分] [小时] [日] [月] [周] [年] 序号 说明 是否必填 允许填写的值 允许的通配符 ...
- SILVERLIGHT 应急卫生模拟演练项目之childwindow
项目中经常要用到childwindow 默认SL提供的界面很不好看 也很难适应系统里的要求 单调的界面 木关系 可以我们可以通过BLEND自定义成我们想要的 首先新建立一个SILVERLIGHT 子窗 ...