注册登陆后可查看附件和大图,以及购买相关内容
您需要 登录 才可以下载或查看,没有账号?注册会员
x
将颜色U32值转换为RGB分量值LabVIEW实现方法1234567先来看一下运行效果: 多种U32颜色值转RGB颜色分量的方法运行效果 多种U32颜色值转RGB颜色分量的方法程序框图 这里一共使用了7种方法,前面两种方法在之前的帖子里介绍过了。 方法三,使用拆分数字函数,将U32拆分为2个U16。再次使用拆分数字,将U16拆分为两个U8,这样得到ARGB。这里需要注意一下,LabVIEW Vision里的彩色颜色值,是使用U32来描述的,但是实际上可能只使用了其中的3字节24位,即只有R、G、B三个值,A代表的透明通道,在LabVIEW中一般是没有表现的。如果打开带A通道的png图像,一般是将其表现为纯黑色0值。所以,使用拆分字节函数,是有一个多出来的A通道的U8的,这个值一般都是没有值的(0值)。这里只是为了方便说明,也显示出来了,实际上可以不显示。这种方法反过来时,即得到了R、G、B分量值时,如果想得到颜色值,那么就可以合并数字,在一些使用dll驱动相机的驱动程序中,可能会使用的比较多。因为那些驱动,通常都是获取单通道的颜色平面,然后需要合并为彩色图像。如大恒工业相机的.NET驱动是这样实现的,而Halcon中的彩色图像转换为LabVIEW Vision的Image,也会涉及到这种情况。 另外需要注意一下,这里的U32的各个颜色分量的组合是按照ARGB的方式来拼接的,透明通道在最高位,A次高位,G次低位,B是最低位的。可能和某些平台的RGBA拼接方式不太一样。 方法四,使用强制类型转换,将U32数字转换为U8数组,再索引得到ARGB各个分量的值。U32颜色值中的排序是ARGB,感觉A是在高位、R是在次高位。但是转换为数组后,则A在前面、B在最后面,按照内存地址或数组元素索引来看,则A是低位、B是高位的,需要注意一下。方法三和四都是比较简单的一种方法。但是需要对LabVIEW的某些函数的使用方法比较了解。比较拆分数字、强制类型转换其实都是使用比较少的功能函数。 而后面的方法五、六、七,则都是基于颜色值,然后进行一些计算,从而得到了R、G、B的分量。都是基于U32=256*256*R+256*G+B这个公式来处理的。 方法五,B直接取U8,G强制转换为U16,再除以256后强制转U8,R直接除以65536,强制转U8。U32颜色值是按照ARGB的顺序将各个颜色分量使用4字节U8拼接成U32,那么将该数据直接转换为U8,就只取最后低一字节的值,则表示了B平面的值。所以,蓝色平面的值是最简单的,直接将U32强制转换为U8即可得到。G则是第二个U8字节,将U32强制转换为U16后,将保留G+B的分量。这时除以256(右移8)后,再强制转换为U8,则是G分量了。这里的G按道理来说,直接除以256就相当于是右移8位,这时再强制转换为U8就可以得到G分量了,但是实际运行时,颜色12345678对应的则G值是255,并不是真实的97。12345678/256=48225.3045875,整数部分48225,二进制是1011 1100 0110 0001,低8位0110 0001则是97。但是将48225.3045875强制转换为U8则为255。但是如果将48225.3045875先强制转换为U16,然后再强制转换为U8,则又可以得到97的正确值: 方法五的另一种实现方法 这里主要涉及到不同数据强制转换时的处理方法不一样。使用除法后,结果总是DBL类型的。对于DBL转整形,使用的是饱和处理方式。当结果超出强制转换的整形类型范围时,则只其结果只能是最大值或最小值,U8被强制限制为0~255。而如果使用长字节整形转换为短字节整形,则使用的是直接取其相应的低位字节,U16转U8时,则取低8位。 方法六,和方法五是比较类似的,B直接强制转换为U8。G右移8位后强制转U8,R右移16位,强制转U8。G的获取则要简单很多了,这里没有使用除法,也就没有DBL浮点型,所以直接右移后仍然是整形,可以直接取低8位。 方法七,则直接使用颜色值进行计算R=U32/65536;G=(U32-R*65536)/256;B=U32-R*65565-G*256。这里实际上就是最底层的加减乘除实现方法。但是也是最复杂的。 后面这些34567的方法,都是针对U32数字的组合方式来处理的。直接操作其相应的字节,如果理解了使用方法,则有些方法要简单很多,老鸟首选。如果不是很理解这些方法,那则拆分相应的字符串会更容易明白一些,适合菜鸟。 LabVIEW 2020版VI: |