不知道有没有人遇到过这种情况。
资源大小并非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);
}