2010-09-16 120 views
8

僅使用C庫(不包括C++,模板等)從純C中的顏色HEX代碼轉換爲RGB RGB結構可能是這樣的 - > typedef struct RGB {double r;雙g;雙b; } RGB1; 函數應返回RGB1從C轉換HEX顏色到RGB結構C

+1

我不確定我是否理解這個問題。我相信,在事件中將事情標記爲代碼和/或在問題中插入新行可能有助於讓人們更容易閱讀(並因此回答)問題。 – cubic1271 2010-09-16 05:24:26

回答

8

RGB值可以通過0xRRGGBB以整數形式存儲。實例:

  • 紅色:爲0xFF0000
  • 綠色:0x00ff00
  • 藍:0x0000ff

00是十六進制十進制0,而ff爲255 0對應於0.0和255爲1.0。 (其實你沒有指定範圍是什麼,我假設爲0.0到1.0)

因此,對於上述假設,你需要提取每個組件併除以255.因爲它聽起來很像一個家庭作業問題,我會告訴你如何做紅色組件。

int hex = 0x123456; 
c.r = ((hex >> 16) & 0xff)/255.0; 

每個十六進制數字佔用4位。因此,向右移動16位(將所有4位數字向右移動),使0xRRGGBB變爲0xRR。現在你有紅色的組件。 (以防萬一在整數中有更高的數據,你可以通過掩蓋數據通過& 0xff擺脫它。)

如果你正在處理字符串"#FFFFFF",那麼你首先必須將其轉換爲上述工作的整數。

14

假設你的十六進制值是一個32位的「廉政」類型,我們使用上述RGB結構,那麼也許這樣做:

struct RGB colorConverter(int hexValue) 
{ 
    struct RGB rgbColor; 
    rgbColor.r = ((hexValue >> 16) & 0xFF)/255.0; // Extract the RR byte 
    rgbColor.g = ((hexValue >> 8) & 0xFF)/255.0; // Extract the GG byte 
    rgbColor.b = ((hexValue) & 0xFF)/255.0;  // Extract the BB byte 

    return rgbColor; 
} 
+0

@ konforce給出的答案不是我們的嗎? – ubiquibacon 2010-09-16 09:43:42

+0

Nah。那裏也有代碼用於字符串處理,但關於這可能是一個家庭作業問題的關鍵點是一個很好的問題。因此,我編輯這個答案更像是上面發佈的一個kon。 – cubic1271 2010-09-16 13:30:11

+0

hexValue應該是unsigned int類型嗎? 我認爲&0xFF可以抵消算術移位,但是當0xFFFFFF傳入時不會產生溢出? – 2015-08-11 04:44:37

6

如果十六進制代碼是一個字符串,你可以這樣

char *str = "0000FF"; 
int r, g, b; 
sscanf(str, "%02x%02x%02x", &r, &g, &b); 

那就是整數,沒有雙打解析它。還請檢查sscanf是否返回3,讀取的項目數。

+0

偉大的答案,簡單和工作! – 2018-01-03 15:08:56