位操作存取RGB颜色值的方法

分享一个位操作存取RGB颜色值的方法。

缘由

我需要在数据库里面存储rgb颜色,但是直接存字符串这样太low了,于是想办法 将rgb颜色经过位运算得到24位的int值,储存在mysql里面可以直接用medium int类型,很节省空间。(当然,c语言并没有24位类型,只有32位的无符号整数,在前面补8位0就ok啦,在我php中就不存在这个现象啦,哈哈)

RGB三种颜色混合成一个整型操作

R:255 24位二进制表示,0000 0000 0000 0000 1111 1111

G:255 24位二进制表示, 0000 0000 0000 0000 1111 1111

B:255 24位二进制表示, 0000 0000 0000 0000 1111 1111

将这rgb三个值经过位运算,(R<<16)|(G<<8)|B,结果如下

1111 1111 1111 1111 1111 1111

步骤是这样的

R左移16位

0000 0000 0000 0000 1111 1111
——————————————— R<<16(左移16位)
1111 1111 0000 0000 0000 0000

G左移8位

0000 0000 0000 0000 1111 1111
——————————————— G<<8(左移8位)
0000 0000 1111 1111 0000 0000

B不做任何改变。

0000 0000 0000 0000 1111 1111

最后,将三个结果用或操作,即可得到运算后的值。

1111 1111 0000 0000 0000 0000
0000 0000 1111 1111 0000 0000
0000 0000 0000 0000 1111 1111
———————————————(或操作)
1111 1111 1111 1111 1111 1111

经过上面的操作,rgb颜色就储存在了一个24位的int值里面了,占3字节,这可比储存字符串要节省多了。

取RGB分量操作

混合了之后自然是要取分量的,逆向上面的操作就可以啦。

假设得到的是color,那么

R = (color>>16) & 0xff
G = (color>>8) & 0xff
B = color & 0xff

0xff就是十进制的255,二进制的 1111 1111 啦,这样做的目的就是只留下最低8位,前面的16位全部置0。分量也就出来了。

 

赞赏

微信赞赏支付宝赞赏

发表评论

电子邮件地址不会被公开。 必填项已用*标注