【问题标题】:How to get the correct `RGB` value of a `PNG` image?如何获得“PNG”图像的正确“RGB”值?
【发布时间】:2016-12-07 12:10:59
【问题描述】:

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 值?哪一个是正确的? 根据下面的cmets,不同的读取顺序和统一压缩的数据可能会导致(0,0)处的像素rgba的值不同。

现在我要重点关注----如何将rgba(0~1) 转换为RGBA(0~255)r_ps=r_unity*255?但是我怎么能解释r=0统一和r=1像素PS(0,0) ?

【问题讨论】:

    标签: image unity3d colors rgb mapbox


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      当我使用绘画测试左下角像素时,我得到的值与您使用 Photoshop 所做的相同。但是,如果您测试左上角,您会得到(1,147,249,255),这是bitmap.GetPixel 返回的结果。

      您所获得的统一价值观似乎有些偏离。尝试致电dem.GetPixel(0,0),以便确定您正在分析最简单的情况。

      【讨论】:

      • Buy 如何将统一(范围 0~1)中的 rgba 值转换为与 PS(范围 0~255)中的相似值?关键是r 的值是0(0,0) 的像素单位。但在 PS 中,r 的值为1。如果我将值转换为r_PS=r_unity*255,结果似乎是不匹配的。
      • 我同意,结果似乎完全无与伦比。你应该能够像你正在做的那样乘以 255,但除非有一些舍入,否则它真的不应该是 0。真正令人担忧的是 B 值。 .718*256=183 远远超过 179。它可能是压缩,正如 david 指出的那样,或者您可能以某种方式比较不同的像素。
      • 我将纹理导入设置统一设置(真彩色,未压缩,maxSize=8192),gbra 像素 (0,0)"RGBA(0.004, 0.596, 0.702, 1.000)"。这似乎工作。那么,应该有类型转换吗? r_PS=Math.Round(r_unity*255)?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-06
      • 1970-01-01
      • 2011-12-10
      • 2020-06-20
      • 2015-03-13
      • 2019-11-07
      • 2011-12-27
      相关资源
      最近更新 更多