僅使用C庫(不包括C++,模板等)從純C中的顏色HEX代碼轉換爲RGB RGB結構可能是這樣的 - > typedef struct RGB {double r;雙g;雙b; } RGB1; 函數應返回RGB1從C轉換HEX顏色到RGB結構C
回答
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"
,那麼你首先必須將其轉換爲上述工作的整數。
假設你的十六進制值是一個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;
}
@ konforce給出的答案不是我們的嗎? – ubiquibacon 2010-09-16 09:43:42
Nah。那裏也有代碼用於字符串處理,但關於這可能是一個家庭作業問題的關鍵點是一個很好的問題。因此,我編輯這個答案更像是上面發佈的一個kon。 – cubic1271 2010-09-16 13:30:11
hexValue應該是unsigned int類型嗎? 我認爲&0xFF可以抵消算術移位,但是當0xFFFFFF傳入時不會產生溢出? – 2015-08-11 04:44:37
我想RGB可以存儲爲爲0xRRGGBB在某些系統上,但在Windows中它實際上存儲爲0xBBGGRR(請參閱http://msdn.microsoft.com/en-us/library/windows/desktop/dd183449)。正如文章中提到的那樣,宏GetRValue,GetGValue和GetBValue已經可用。
如果十六進制代碼是一個字符串,你可以這樣
char *str = "0000FF";
int r, g, b;
sscanf(str, "%02x%02x%02x", &r, &g, &b);
那就是整數,沒有雙打解析它。還請檢查sscanf
是否返回3,讀取的項目數。
偉大的答案,簡單和工作! – 2018-01-03 15:08:56
我不確定我是否理解這個問題。我相信,在事件中將事情標記爲代碼和/或在問題中插入新行可能有助於讓人們更容易閱讀(並因此回答)問題。 – cubic1271 2010-09-16 05:24:26