如何获得'PNG`图像的正确“RGB”值?

时间:2016-12-07 12:11:00

标签: image unity3d colors rgb mapbox

MapboxGlobal elevation data提供PNG图像中编码的高度数据。高度由height = -10000 + ((R * 256 * 256 + G * 256 + B) * 0.1)解码。详细信息位于https://www.mapbox.com/blog/terrain-rgb/

我想导入高度数据以生成Unity3D中的地形。

Texture2D dem = (Texture2D)AssetDatabase.LoadAssetAtPath("Assets/dem/12/12_3417_1536.png", typeof(Texture2D));
    for (int i = 0; i < width; i++)
        for (int j = 0; j < height; j++)
        {
            Color c = dem.GetPixel(i, j);

            float R = c.r*255;
            float G = c.g*255;
            float B = c.b*255;
            array[i, j] = -10000 + ((R * 256 * 256 + G * 256 + B) * 0.1f);
        }

在这里,我设置了一个断点,第一个像素的rgba值为RGBA(0.000, 0.592, 0.718, 1.000)c.r0。高度不正确,因为这一点代表山上某处的高度。

然后我在Photoshop中打开图片并获取第一个像素的RGBR=1,G=152,B=179

我在C#编写测试程序。

System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap("12_3417_1536.png");
Color a = bitmap.GetPixel(0, 0);

它显示Color a(R,G,B,A)=(1,147,249,255)

这是我测试的图像: https://api.mapbox.com/v4/mapbox.terrain-rgb/12/3417/1536.pngraw?access_token=pk.eyJ1Ijoib2xlb3RpZ2VyIiwiYSI6ImZ2cllZQ3cifQ.2yDE9wUcfO_BLiinccfOKg

为什么我用不同的方法得到不同的RGBA值?哪一个是正确的? 根据下面的评论,不同的读取顺序和统一的压缩数据可能会导致rgba处像素(0,0)的值不同。

现在我想关注----如何将rgba(0~1)转换为RGBA(0~255)r_ps=r_unity*255?但是,如何在r=0处的像素PS中以单位和r=1解释(0,0)

2 个答案:

答案 0 :(得分:1)

尝试从Unity中的纹理导入设置禁用压缩(无压缩)。或者,如果在运行时获取数据,则可以使用Texture.LoadBytes()来避免压缩工件。

答案 1 :(得分:0)

我将假设您使用的是相同的图片,并且在单独的文件夹中没有两个12_3417_1536.png文件。

这些函数中的每一个都具有不同的概念,其中像素位于(0,0)。不确定你的意思&#34;首先&#34;使用photoshop测试时的像素,但单位的纹理坐标从左下角开始。

当我使用paint测试左下角像素时,我获得了与photoshop相同的值。但是,如果您测试上方左上角,则会得到(1,147,249,255),这是bitmap.GetPixel返回的结果。

你所获得的统一价值观似乎已经过时了。请尝试拨打dem.GetPixel(0,0),以便确定您正在分析最简单的案例。