VB.NET下BGR555颜色转换器开发异常问题求助
BGR555颜色转换函数问题排查与修正
首先明确BGR555的16位结构:高5位为蓝色(B),中间5位为绿色(G),低5位为红色(R),最高位保留为0,最终格式为 0b0BBBBBGGGGGRRRRR。对于#FFFFFF(R=255、G=255、B=255),每个通道取高5位都是31(255 >> 3 = 31),组合后是0b0111111111111111,即十六进制0x7FFF(十进制32767)。
你的函数返回2048(0x0800),说明只有绿色通道的某一位被错误触发,核心问题大概率是通道顺序颠倒、移位位数计算错误或未正确保留通道高5位。
常见错误点及修正方案
- 通道顺序搞反:误将RGB顺序组合成RGB555而非BGR555,导致蓝色位未被正确设置。
- 移位位数错误:比如将绿色通道移到了错误的位段(如<<11而非<<5),或蓝色通道移位不足。
- 未截取高5位:直接使用原始8位通道值,未做
>>3操作,导致低位干扰高位。
修正后的VB.NET函数
Function HexToBGR555(hexColor As String) As UInt16 ' 移除十六进制字符串的#前缀 hexColor = hexColor.TrimStart("#"c) ' 解析RGB各通道的8位值 Dim r As Integer = Convert.ToInt32(hexColor.Substring(0, 2), 16) Dim g As Integer = Convert.ToInt32(hexColor.Substring(2, 2), 16) Dim b As Integer = Convert.ToInt32(hexColor.Substring(4, 2), 16) ' 截取每个通道的高5位,并按BGR顺序移位组合 Dim b5 As Integer = (b >> 3) << 10 ' 蓝色占第10-14位 Dim g5 As Integer = (g >> 3) << 5 ' 绿色占第5-9位 Dim r5 As Integer = r >> 3 ' 红色占第0-4位 ' 合并为16位无符号整数返回 Return CUShort(b5 Or g5 Or r5) End Function
调用HexToBGR555("#FFFFFF")将返回32767(十六进制0x7FFF),符合预期的大端模式结果。
内容的提问来源于stack exchange,提问作者VMMR
相关产品推荐
相关产品推荐

