我有一张(附有)我正在用作测试的图像。我正在尝试获取并存储数组中每个像素的所有颜色。
我使用下面的代码来做到这一点;
Texture2D tex = mapImage.mainTexture as Texture2D;
int w = tex.width;
int h = tex.height;
Vector4[,] vals = new Vector4[w, h];
Color[] cols = tex.GetPixels();
for (int y = 0; y < h; y++)
{
for (int x = 0; x < w; x++)
{
if(cols[y+x] != Color.black)
{
Debug.Break();
}
vals[x, y] = cols[(y + x)];
}
}
其中mapImage是一个公共Material变量,我将其拖动到预制件的场景中。如您所见,我在此处添加了一个调试测试,以便在达到非黑色时暂停编辑器。永远不会被击中。
有趣的是,我还运行了另一个脚本,该脚本使用同一图像告诉我单击位置的颜色值(GetPixel())。效果很好(不同的方法,但最终都使用相同的材料)
我不知道为什么GetPixels()总是发黑吗?
我还一直在考虑只将图像数据加载到字节数组中,然后将值解析到Vector4中,但希望最终可以使用。
答案 0 :(得分:2)
您没有正确索引到Color
数组中。使用正在使用的索引y+x
,您可以在纹理的最低行上继续检查相同的值,而不会超过特定点。
相反,在计算索引时,您需要将所在行乘以行长,并将其添加到所在列:
Texture2D tex = mapImage.mainTexture as Texture2D;
int w = tex.width;
int h = tex.height;
Vector4[,] vals = new Vector4[w, h];
Color[] cols = tex.GetPixels();
for (int y = 0; y < h; y++)
{
for (int x = 0; x < w; x++)
{
int index = y * w + x;
vals[x, y] = cols[index];
}
}
摘自GetPixels
上的文档:
返回的数组是一个展平的2D数组,其中像素从左到右,从下到上(即逐行)排列。数组大小是宽度乘以所使用的mip级别的高度。默认的mip级别为零(基本纹理),在这种情况下,大小仅为纹理的大小。通常,mip级别的大小为
mipWidth=max(1,width>>miplevel)
,高度也类似。