代码之家  ›  专栏  ›  技术社区  ›  NeoKuro

Unity:GetPixels()总是在整个图像中产生黑色

  •  0
  • NeoKuro  · 技术社区  · 5 年前

    我有一张图片(附呈)作为测试。我正在尝试获取并存储阵列中每个像素的所有颜色。

    我使用下面的代码来实现这一点;

        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是一个公共的材质变量,我把它拖到预置的场景中。如您所见,我在那里添加了一个调试测试,以便在达到非黑色时暂停编辑器。这永远不会被击中。

    我不知道为什么GetPixels()总是显示为黑色?

    我也在考虑将图像数据加载到一个字节数组中,然后将值解析为一个向量4,但希望这最终能奏效。

    enter image description here

    0 回复  |  直到 5 年前
        1
  •  3
  •   Ruzihm aks786    5 年前

    你没有索引到 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 level为零(基本纹理),在这种情况下,大小只是纹理的大小。一般情况下,mip级别大小为 mipWidth=max(1,width>>miplevel) 身高也一样。