將ARGB的數值轉為RGB的碎碎念 (很宅, 正妹勿入) @ 資訊技術與心情 :: 隨意窩 Xuite日誌
  • 即時碎碎唸
    1. 沒有新回應!
  • 累積 | 今日
    loading......
  • 搜尋本Blog文章

  • 關鍵字
  • 2007-07-12 23:31 將ARGB的數值轉為RGB的碎碎念 (很宅, 正妹勿入)
    平均分數:0 顆星    投票人數:0
    我要評分:
    由於同事用C#將顏色的設定以整數形式寫出檔案
    他是用System.Drawing.Color.ToArgb()所寫出來的ARGB格式
    該格式共計有4個byte
    由左至右分別是ARGB四項值
    而我則必須在C裡頭將rgb值取出繪圖

    本想說若要取出RGB值
    就將該數值與00000000111111111111111111111111做&運算就好
    沒想到平常C++用的RGB(255,0,0)這種巨集時
    由左而右分別是B->G->R
    跟.Net中的ARGB剛好相反
    為什麼我知道C裡頭是BGR呢?
    只要看了下面這個巨集宣告就會很清楚啦
    #define RGB(r, g ,b) ((DWORD) (((BYTE) (R) | ((WORD) (G) << 8)) | (((DWORD) (BYTE) (B)) << 16)))

    講到這個就不得不說
    以前學位元運算子<<,>>,&,|時都覺得這些東西不知道幹嘛用
    但看了上面這個宣告才知道位元運算有時候真的是很讚阿:p
    至於實際的轉換程式
    我把雛形寫在下面

    int CStaticFuntion::ARGB2RGB(int ARGB)
    {
    const int Mask=(1<<24)-1;
    //00000000,11111111,11111111,11111111
    ARGB=ARGB & Mask;
    byte B=(byte)ARGB;
    byte G=(byte)(ARGB>>8);
    byte R=(byte)(ARGB>>16);
    return ( RGB(R,G,B) );
    }

    反正就是先弄出224-1來把ARGB中的A都變成0
    然後依序取出B,G,R等對應byte的值
    照理說數值都應該和255做&運算
    但是若故意把R,G,B都宣告成byte
    強制轉型時就會有相同的效果
    剛好可以省去與255做&運算

    也有和同事提到把B,G,R都用整數來宣告
    看起來若這樣處理的話就勢必要與255做&運算
    否則B和G值一定會大於255
    看似好像有問題
    但實際上
    由於丟到RGB(x,x,x)的巨集時
    巨集中也明顯看到把r,g,b都強制轉成BYTE
    所以傳回值應該也會是正確的

    這篇真的是太宅了
    很容易看到睡著的


    心不在焉 / Xuite日誌 / 回應(0) / 引用(0) / 好文轉寄
    回應