将RGB颜色转换成16bit颜色
[适合与游戏编程初学者]
我在做16bit alpha blending的时候需要判断颜色键(ColorKey),而在我的游戏引擎中,ColorKey是用Windows RGB颜色表示的,这就需要将RGB颜色转换成16bit颜色,下面是我的做法。
RGB颜色是一个DWORD值,32bit,格式为0x00rrggbb,通过三个宏:GetRValue、GetGValue和GetBValue可以得到三个颜色分量,用8bitBYTE表示。16bit颜色有555和565两种,以565为例,565模式的16bit颜色格式为:rrrrrggggggbbbbb。我们的任务就是将0x00rrggbb转成rrrrrggggggbbbbb。
首先将RGB的三个分量分离出来,将它们分别转成用5bit,6bit,5bit表示的颜色(前3bit,2bit,3bit为0)。因为8bit是256级色度,转成5bit是32级色度,所以每8级色度一组转成1级色度,除以8(右移3位)就行;同样转成6bit只要除以4,因为6bit能表达64级色度。然后再将得到的5bit与上0x1f,6bit与上0x3f,将8bit前面的3bit或2bit清0。这时得到的三个分量为:R=000rrrrr , G=00gggggg , B=000bbbbb 。最后将它们移位相或就可得到一个16bit565模式的颜色了。运算式如下:
Color16bit =( ( GetRValue(ColorRGB)>>3 ) & 0x1f)<<11 |
( ( GetGValue(ColorRGB)>>2) & 0x3f)<<5 |
( GetBValue(ColorRGB)>>3 ) & 0x1f;
其实并没有必要与上0x1f和0x3f,因为转化后的色度范围是0~31或0~63,前3bit或2bit必为0(从位运算角度看右移后前面空出来的位自动填0);所以去掉上面的与操作,就是(注意移位操作不能合并,否则不能使前3bit,2bit清0):
Color16bit = GetRValue(ColorRGB)>>3<<11 | GetGValue(ColorRGB)>>2<<5 | GetBValue(m_ColorRGB)>>3 ;
挺简单吧,只不过是一堆位运算。只要多动动脑筋,我们可以很容易的写出各种格式之间的转换式。
分享到:
相关推荐
C#编写的24bit(RGB888)与16bit(RGB565)颜色格式相互转换小工具,免安装直接运行coloredit.exe
特别是在TFT液晶编程时,需要将RGB24位色按照5,6,5转换为16位的颜色代码,每次计算太麻烦,该软件只需输入24位颜色代码,即可给出16的代码。
这是一个超级牛逼的音频转换软件,可以将16bit转换成宇宙音质,耗时50分钟,编写完毕。牛逼的一塌糊涂。
RGB2 16bit I_F of CPT 2.4LCD with ST7787_20070110.pdf
(RGB颜色转化为16位颜色小工具),同事在作TFT屏等单片机开发屏幕程序时,经常问我上位机的红色GRB(255,0,0)转化为下位机红色时,值是多少呢?索性自已开发了一个小工具,供有同样遭遇的朋友直接使用。
ColorChecker各个色块的16bit RGB值
此工程实现了一种多个16bit数据转8bit数据的逻辑方式,未使用FIFO
网上找不到16位的颜色表,自己用24位颜色表转了16位RGB 5-6-5格式,从表格里拷贝出来放到C代码里用 很方便,用Excel自动生成大量宏定义很好用
将yuv422格式的图像转为8位rgb灰度图像
写一个液晶底层程序的时候可能用得着,为了自己方便也为了他人方便,特地写了这么个小工具
内含:单通道16k-16bit音频 和 1个双通道8k-16bit音频 及一个双通道16k-16bit音频,英文wav音频,音频测试使用,有条件的同学建议去一些数据集官网下载就好。
批量快速将多张bmp图片转换为bin文件,bmp图片位深度为24bit,bin文件可选择8bit(RGB323)、16bit(RGB565)、24bit(RGB888) 输出,用于烧录到 外部flash,单片机去读取数据显示图像。因为输出每张bmp图片所在flash里的...
RGB1 16bit I_F of CPT 2.4LCD with ST7787_20070110.pdf
将16位565bmp转到8位256色图片,先将16位565bmp转到24位位图,再将24位位图转到8位256色位图。
TI,16bit电平转换芯片手册................................................................................
简单实用的CRC16bit 实际项目中应用若干年 #ifndef CRC_H #define CRC_H #ifndef CRC #define externok extern #endif externok unsigned char SumCheck(unsigned char *address,unsigned char lenNumb); ...
基于FFmpeg,实现 8k 16bit 立体声 转码 16k 16bit 单声道。
Mp3 转换为 16k 16bit 单声道 pcm ffmpeg -y -i test.mp3 -acodec pcm_s16le -f s16le -ac 1 -ar 16000 test.pcm wav 转换为 16k 16bit 单声道 pcm ffmpeg -y -i test.wav -acodec pcm_s16le -f s16le -ac 1 -ar ...
16bit UUID一览表
可以将BMP图片转换成RGB的软件,可以实现8bit 12bit 16bit 18bit