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);