Unity:GetPixels()始终在整个图像上产生黑色

时间:2019-05-13 18:21:14

标签: c# image unity3d image-processing image-manipulation

我有一张(附有)我正在用作测试的图像。我正在尝试获取并存储数组中每个像素的所有颜色。

我使用下面的代码来做到这一点;

    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中,但希望最终可以使用。

enter image description here

1 个答案:

答案 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),高度也类似。