| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2864 人关注过本帖
标题:下面红色的标记的代码表示什么意思?
只看楼主 加入收藏
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1547
专家分:184
注 册:2006-6-3
收藏
得分:0 
我问的为什么:BITAND(lnColor, 0x0000FF)   虽然结果是红色为什么lnColor要与0x0000FF(兰色吗)按位与吗?        
         BITRSHIFT(BITAND(lnColor, 0x00FF00),  8)   为什么与0x00FF00按位与,并转位8,它结果变成什么色?
        BITRSHIFT(BITAND(lnColor, 0xFF0000), 16) 为什么与0x00FF00按位与,并转位16,  它转位变成什么色?
下面附上二张图是程序运行时及运行结果
图片附件: 游客没有浏览图片的权限,请 登录注册

图片附件: 游客没有浏览图片的权限,请 登录注册


2012-01-17 23:01
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
0x0000FF中FF在低位,那是紅色,哪來的與藍色按位與。那是提取紅色所在位置的值。

比如RGB(237,138,176),這個Color值為11569901,即0xB08AED,執行跟0x0000FF與運算,得到0xED,這個10進制是237,就是紅色的值。你用計算器算一下。
0xB08AED & 0x00FF00 = 0x8A00,右移8位,即是0x8A,這個是138,是綠色的值。
0xB08AED & 0xFF0000 = 0xB00000,右移16位,即是0xB0,這個是176,是藍色的值。

其實,只要把Color的值輸出為16進制表示,依次看左中右三個獨立的16進制數據,就分別是藍、綠、紅值了。這種FF處於不同位置與數據與運算的動作,那三個0x0000FF、0x00FF00、0xFF0000,就叫“掩碼”,就是提取指定位置數據的。

[ 本帖最后由 TonyDeng 于 2012-1-17 23:24 编辑 ]

授人以渔,不授人以鱼。
2012-01-17 23:13
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1547
专家分:184
注 册:2006-6-3
收藏
得分:0 
這個Color值為11569901,即0xB08AED,執行跟0x0000FF與運算为什么用它0x0000FF與運算提取红色?
同理与0x00FF00与运算提取录色?
与0xFF0000 与运算提取兰色?

2012-01-18 00:03
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:10 
前面說了呀,0x000000,是24位數據的空間不是?每個00是1個字節。紅、綠、藍的色值分別在這三個字節中,位置是固定的。紅色在最右邊的00位置處,用0x0000FF,FF掩碼正在這個位置,就是提取這個位置的數值,即取出最右邊8位二進制數,那個就是紅色值。其餘也是這樣看。你看前面的運算,三個掩碼,FF是分別佈置在三個位置的,就是這樣提取數據,FF在哪個方位,就取那個方位的數據。

分色位置:  藍|綠|紅
  真實值:0xB0|8A|ED
    掩碼:0x00|00|FF 取出0xED
          0x00|FF|00 取出0x8A
          0xFF|00|00 取出0xB0
這樣看,清晰了吧?

[ 本帖最后由 TonyDeng 于 2012-1-18 00:13 编辑 ]

授人以渔,不授人以鱼。
2012-01-18 00:09
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1547
专家分:184
注 册:2006-6-3
收藏
得分:0 
下面又如此介释?

0xff0000意味红为最大,绿蓝都为零 (红色)
0x00ff00意味着绿为最大,红蓝为零(绿色)
0x0000ff意味着蓝为最大,红绿为零(蓝色)


紅色在最右邊的00位置處,用0x0000FF,如何理介?
0x0000ff意味着蓝为最大,红绿为零(蓝色),又如何理介?

2012-01-18 00:18
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
那是很簡略的說法。RGB三色體系中的每個分色,其取值範圍都是0-255(8位二進制數的全部值就只有256個),8位全部為1(即256)的時候,是FF,這個不是可用值,只是說它比255大(其實從計算機的處理角度這個數是-1)。那段話說的只能作我上面所列舉的那樣理解,是掩碼位置,不是什麼最大色值。

授人以渔,不授人以鱼。
2012-01-18 00:23
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1547
专家分:184
注 册:2006-6-3
收藏
得分:0 
分色位置:  藍|綠|紅
  真實值:0xB0|8A|ED
    掩碼:0x00|00|FF 取出0xED
          0x00|FF|00 取出0x8A
          0xFF|00|00 取出0xB0
上述懂了,但与下面对照又有点糊了???
0xff0000意味红为最大,绿蓝都为零 (红色)
0x00ff00意味着绿为最大,红蓝为零(绿色)
0x0000ff意味着蓝为最大,红绿为零(蓝色)

2012-01-18 00:27
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
見16樓,你那個是忽悠讀者的說法。RGB顏色中,三種分色是沒有大小比較關係的,是分立的。

授人以渔,不授人以鱼。
2012-01-18 00:29
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1547
专家分:184
注 册:2006-6-3
收藏
得分:0 
掩碼与RGB顏色表示方法是二个不同概念吗?有何联系?
2012-01-18 00:40
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
字符串各個字符之間有什麼關係?一點關係也沒有。

Color是一個3字符的字符串,第一個字符代表藍色,第二個字符代表綠色,第三個字符代表紅色。每個字符的內碼即ASC()就是分色值。所謂掩碼,只是用數值計算時遮掩不需要部分留下需要部分的一種運算手段,因為把Color視為數值的時候,它是一個24位長整數,要用一定的手段分離各個項。

其實,如果你在別的語言學過“結構”(struct)的概念的話,就能明白Color其實是一個結構型數據:
struct RGB_Color {
    int blue;
    int green;
    int red;
}
在內存中,三個數據從下往上排,整個RGB_Color的數值看起來就是一個24位的巨型整數,但其實是通過前面所說的公式運算得到的。

這個問題,跟漢字的編碼是完全相同的道理。你用ASC("中")看看,這個漢字的內碼是多少,一個很龐大的數據,但其實是兩個字節用上面的方法算出來的。換句話說,把這個大整數看成是一個整體、還是兩個獨立個體由某種方式組合得到的,隨便你,都可以。眾所周知,計算機中的漢字是由兩個ASCII字符組成的,每個ASCII字符的內碼就在0-255之間,但正如你看到的,"中"的內碼遠遠大於256,其實是a*256+b,a和b分別在0-255之間取值。

看看下面的結果:

漢字"中"的內碼是54992=214*256+208,正如你看到的,我對"中"分別取了左右各1個字符看它們的內碼。現在你運行 ? CHR(214)+CHR(208),看到了什麼?

RGB_Color也是這樣的東西,只是它是由三個字符組成的。

[ 本帖最后由 TonyDeng 于 2012-1-18 01:04 编辑 ]

授人以渔,不授人以鱼。
2012-01-18 00:50
快速回复:下面红色的标记的代码表示什么意思?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018480 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved