Unity图片处理 批量改画布大小

不知道有没有人遇到过这种情况。资源大小并非2的整数幂,导致Unity无法压缩。而且资源量很大,无法放在PS里去一张一张的去修改画布。问题分析最开始,我是放在PS里修改画布来让图片修改为2的整数幂的尺寸。但是看着文件夹里几百帧的贴图。我顿时陷入了沉思。显然不能手动来做…Unity的Texture2D似乎可以用来处理这个问题。需要注意的一个地方Color[] texturePix...
摘要由CSDN通过智能技术生成

不知道有没有人遇到过这种情况。
资源大小并非2的整数幂,导致Unity无法压缩。
而且资源量很大,无法放在PS里去一张一张的去修改画布。

问题分析

在这里插入图片描述
最开始,我是放在PS里修改画布来让图片修改为2的整数幂的尺寸。
但是看着文件夹里几百帧的贴图。
我顿时陷入了沉思。
显然不能手动来做…

Unity的Texture2D似乎可以用来处理这个问题。
需要注意的一个地方

Color[] texturePixels = Texture2D.GetPixels();

在这里插入图片描述
我原本以为会是一个二维数组,因为图片像素的排布可以看作一个二维数组么。
不过问题也不大在这里插入图片描述
像素图片的像素在数组中的索引是以这种方式排布的。
在这里插入图片描述
所以如何把一张图的像素转到另一张上,便成了这样的一个数学问题。
(需要创建一张目标规格的图片,然后将原图的像素转移到正确位置)
(左:目标图,右:原图)

所以实际在索引并且确定目标图每一个像素颜色的时候,需要将目标图的索引号(左)转换为原图的索引号(右)并正确赋值,才能够将原图的信息正确的保存在我们目标规格的图片上。
实际上也只是一个
0 = func(7)
1 = func(8)

4 = func(13)

的问题。

在Texture的定义里,是有图片的宽高的,通过宽高,我们便可以将这个一维数组转换为一个二维数组的模型,来获得这个像素所在的行和列(个人row,culomn容易搞混,所以行列用x,y表示)

Texture2D.width
Texture2D.height

首先还是分析个例,
在左图上7号像素所在的位置是(1,1),对应的像素是右图中0号像素(0,0)。
从(1,1)到(0,0),x,y都减掉了1。
1是两张图片的长宽差的一半。
所以就有了(伪代码)
(current代表原图,target代表目标图,类型Texture2D)

public int GetCurrentIndex(int targetIndex)
{
   
	int widthDifference = target.width - current.width;
	int heightDifference = target.height - current.height;
	
	widthDifference /= 2;
	heightDifference /= 2;
	
	int x = targetIndex % target.width;
	int y = targetIndex / target.width;
	
	x -= widthDifference;
	y -= heightDifference;
	
	int currentIndex = y * current.width + x;
	return currentIndex;
}

可以通过先将目标图片得一维索引转换为二维索引,减去两张图片相差得结果之后,获得在原图得二维索引,再转换为原图得一维索引,这样就可以获得原图在目标图上每个像素得正确位置。
也就是完成了 0 = func(7)的 func 函数算法。

但是这样做的话,不仅目标图蓝圈内的像素会获取像素,外部的像素依旧能够找到,而且也可能因为太大而超出原图的索引。所以我们需要做一个判断,来让外部的像素完全透明。
(同样是伪代码)

if(x >= 0 && y >= 0 && x < current.width && y < current.height && currentIndex< currentPixels.Length)
{
   
	targetPixels[targetIndex] = currentPixels[currentIndex];
}
else
{
   
	targetPixels[targetIndex] = new Color(0, 0, 0, 0);
}
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值