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

Image 如何获得“PNG”图像的正确“RGB”值?,image,unity3d,colors,rgb,mapbox,Image,Unity3d,Colors,Rgb,Mapbox,Mapbox提供全局高程数据,高度数据编码在PNG图像中。高度由Height=-10000+((R*256*256+G*256+B)*0.1)解码。详情请参阅 我想导入高度数据以在Unity3D中生成地形 Texture2D dem = (Texture2D)AssetDatabase.LoadAssetAtPath("Assets/dem/12/12_3417_1536.png", typeof(Texture2D)); for (int i = 0; i < width; i+

Mapbox
提供
全局高程数据
,高度数据编码在
PNG
图像中。高度由
Height=-10000+((R*256*256+G*256+B)*0.1)解码。详情请参阅

我想导入高度数据以在
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);
        }
它显示的
颜色a
(R、G、B、a)=(1147249255)

以下是我测试的图像:

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

现在我想集中讨论----如何将
rgba(0~1)
转换为
rgba(0~255)
r\u ps=r\u unity*255
?但是我怎样才能统一地解释
r=0
r=1
(0,0)

我假设您使用的是同一张图片,并且在不同的文件夹中没有两个
12_3417_1536.png
文件

每个函数都有一个不同的概念,即哪个像素位于
(0,0)
。不确定用photoshop测试时“第一个”像素是什么意思,但unity中的纹理坐标从左下角开始

当我使用paint测试左下角像素时,得到的值与使用photoshop时得到的值相同。但是,如果测试左上角,则会得到
(1147249255)
,这是位图的结果
。GetPixel
返回


你所得到的统一价值观似乎太离谱了。尝试调用
dem.GetPixel(0,0)
,这样您就可以确定您正在分析最简单的情况

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

Buy如何将
rgba
的单位值(范围0~1)转换为与PS类似的值(范围0~255)?关键是
r
的值是
0
,以
(0,0)
处的像素为单位。但在PS中,r的值是
1
。如果我用
r\u PS=r\u unity*255
转换值,结果似乎不匹配。我同意,结果似乎完全不匹配。你应该可以像现在这样乘以255,但除非有舍入,否则它真的不应该是0。令人担忧的是B值
.718*256=183
这比179多得多。正如david指出的,这可能是压缩,也可能是比较不同的像素。我在unity中设置纹理导入设置(truecolor,未压缩,maxSize=8192),
gbra
在像素
(0,0)
“RGBA(0.004,0.596,0.702,1.000)”
。这似乎有效。那么,应该有一个类型转换吗
r\u PS=Math.Round(r\u unity*255)
System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap("12_3417_1536.png");
Color a = bitmap.GetPixel(0, 0);