如何获得RGB的各个颜色值

来源:互联网 发布:抽签软件网页版 编辑:程序博客网 时间:2024/05/16 05:56
作者:唐宏冰
主页:http://jmtk.xiloo.com
作品:决战单词——让我们告别背单词的苦恼!
邮件:hb_t@sohu.com


一、在C或Pascal中的实现方法。
因为C语言和Pascal语言能支持计算机比较底层的操作,提供了位运算和指针,所以实现起来相当的容易和高效。
1、用位运算来实现。
我们只要通过位运算分别取出32位色彩值的第一字节、第二字节和第三字节即可。Red、Green和Blue所分别对应这三个字节。例如C语言中可以是这样的:

/*定义位运算所需的掩码*/
#define MASK_R 0xFF
#define MASK_G 0xFF00
#define MASK_B 0xFF0000
/*函数的第一个形参是32位长整型色彩值,其余的参数分别返回红、绿、蓝的色彩值。*/
void GetRGB(long int color,char *r,char *g,char *b)
{
*r=color & MASK_R; //取出第一字节给红色
*g=(color & MASK_G)>>8; //取出第二字节给绿色
*b=(color & MASK_B)>>16;//取出第三字节给蓝色

}

2、用指针运算来实现。使指针指向不同的内存空间来获得红绿蓝的色彩值。
void GetRGB(long int color,char *r,char *g,char *b)
{
long int *pcolor;
char * ptemp; //声明一个字符指针,只能指向一个字节。
pcolor=&color;
ptemp=(char *)pcolor; //临时指针指向长整型色彩值的第一位
*r=*ptemp; //第一位即为红色
*g=*(++ptemp); //指向第二个字节,得到绿色
*b=*(++ptemp); //指向第三个字节,得到蓝色
}
二、在Basic这类没有指针、位运算的语言中的实现。
由于Basic语言的先天不足,没有C语言和Pascal语言的指针和位运算,实现起来好像比较因难,最重要的是效率低下。例如,常常是这样:
'过程的第一个参数为颜色总量,其它三个参数返回红绿蓝的值。
Private Sub GetRGB(lColor As Long, bRed As Byte,bGreen As Byte, bBlue As Byte) 
    bRed = lColor Mod 256
    bBlue = lColor \ 65536
    bGreen = (lColor And 65535) \ 256
   
End Sub

那么,有没有效率高、好理解的方法呢?当然有!我们需要一个Windows API函数来帮忙,它的原形是:
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
该函数的作用是把一段内存中的数据拷贝到另一段内存中,Source表示源,Destination表示目标,Length表示拷贝的字节长度。我们由这个函数自然会想到,何不把一个32位色彩值拷贝到一个由4个Byte构成的结构中呢,那么这4个Byte的前3个变量就分别是Red、Green和Blue的值了。例如:
'首先定义一个由4个Byte变量构成的数据类型
Private Type Color32
    bRed As Byte
    bGreen As Byte
    bBlue As Byte
    bUnuse As Byte
End Type
Private Sub GetRGB(lColor As Long, bRed As Byte, bGreen As Byte, bBlue As Byte)
    Dim TempColor32 As Color32
    
    CopyMemory TempColor32, lColor, 4 '拷贝4个字节到结构中
    With TempColor32
        bRed = .bRed
        bGreen = .bGreen
        bBlue = .bBlue
    End With
        
End Sub
用这种方法来实现,相当的直观,更符合思维习惯,执行的速度也更快些,何乐而不为呢?其实这种方法给了我们一个很好的启示,凡是那些需要从某种类型的变量中取出一部分值的操作都可向这样实现了。
本文中的C程序段在TC3.0下通过,Basic程序段在VB6.0下通过。
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 刚做的系统玩cf卡屏怎么办 办健康证的资料掉了怎么办 刚刚办得的健康证掉了怎么办 房子都过户了银行贷不了款怎么办 我要办大病迁出应该怎么办啊? 遗产继承后户口没地迁出怎么办 安徽蒙城怎么办去韩国的签证的 夜间有人私自收停车费应该怎么办 上次摸不到环尾丝这次摸到了怎么办 法院判决书下来后对方不给钱怎么办 法院判决书下来了钱还保全么怎么办 深圳路边泊车不知道泊车编号怎么办 当事人进拘留所了我的工资怎么办 昆明公租房住满5年后怎么办 昆明公租房房子到期缴纳金怎么办 看守所犯人银行卡里钱没用完怎么办 中国邮政迟迟没有把信件寄到怎么办 拘留15天放出来还不肯还钱怎么办 人死在拘留所不让看监控怎么办 家人吸毒可他又不愿强戒怎么办 容留他人吸毒时签了强戒怎么办 拘留后发现被拘留是人大代表怎么办 执行局要拘留人找不到人怎么办 开设赌场罪拘留37天了该怎么办 对治安处罚光罚款不拘留怎么办 打架和解后警察不给消案怎么办 12个人片诈骗刑拘了28天怎么办 交警拘留几天后还是没钱赔偿怎么办 平安车主信用卡车牌号填错了怎么办 起诉借钱的人逮起来了怎么办 在法院查不到坐牢人的档案怎么办 人被冤枉敲诈勒索进看守所了怎么办 打架被拘留孩子怎么办三周了 技师被拘留她的家人该怎么办 我是担保人贷款人跑了我该怎么办 公司依旷工理由辞退我该怎么办 试工两天被辞退了不发工资怎么办 员工在单位被打监控调不出来怎么办 老师罚做60张试卷家长该怎么办 孩子在幼儿园被老师打该怎么办 孩子被孩子打了老师该怎么办?