2017-07-23 38 views
-1

我有一個16個單元格的數組,我知道位置0(a)和位置15(b)。在點a到b之間線性遞增RGB565值

我想要線性增加點a到b之間的RGB值。

這是我的功能到目前爲止得到一個十六進制並將其轉換爲RGB,但我不確定如何擴展它以執行上述操作。

void rgb(int hexValue) 
{ 
    unsigned r = (hexValue & 0xF800) >> 11; 
    unsigned g = (hexValue & 0x07E0) >> 5; 
    unsigned b = hexValue & 0x001F; 

    r = (r * 255)/31; 
    g = (g * 255)/63; 
    b = (b * 255)/31; 

    printf("r: %d, g: %d, b: %d\n", r, g, b); 
} 

非常感謝提前。

編輯: 按我在下面評論,這是試圖解決這樣一個例子代碼..

int ra = 0; 
int ga = 0; 
int ba = 0; 

int rb = 255; 
int gb = 255; 
int bb = 255; 

int r = 0; 
int g = 0; 
int b = 0; 

for(int i = 0; i < W; i++) 
{ 
    r = (ra*((W-1)-i) + rb*i)/(W-1); 
    g = (ga*((W-1)-i) + gb*i)/(W-1); 
    b = (ga*((W-1)-i) + bb*i)/(W-1); 

    printf("loop is: %d -- r: %d, g: %d, b: %d\n", i, r, g, b); 
} 

是這個邏輯是否正確?如果是這樣,那麼我需要得到ra,ga,ba並將它們轉換回十六進制。

我的輸出是:

loop is: 0 -- r: 0, g: 0, b: 0 
loop is: 1 -- r: 17, g: 17, b: 17 
loop is: 2 -- r: 34, g: 34, b: 34 
loop is: 3 -- r: 51, g: 51, b: 51 
loop is: 4 -- r: 68, g: 68, b: 68 
loop is: 5 -- r: 85, g: 85, b: 85 
loop is: 6 -- r: 102, g: 102, b: 102 
loop is: 7 -- r: 119, g: 119, b: 119 
loop is: 8 -- r: 136, g: 136, b: 136 
loop is: 9 -- r: 153, g: 153, b: 153 
loop is: 10 -- r: 170, g: 170, b: 170 
loop is: 11 -- r: 187, g: 187, b: 187 
loop is: 12 -- r: 204, g: 204, b: 204 
loop is: 13 -- r: 221, g: 221, b: 221 
loop is: 14 -- r: 238, g: 238, b: 238 
loop is: 15 -- r: 255, g: 255, b: 255 
+1

整數包含數字不是十六進制數字BTW。 – user0042

+0

是的,十六進制是一種編寫數字而不是內部表示的方式,所以你不能傳入「hexvalue」,你只需傳入一個可以變成任何字符串表示的數字,十六進制或其他。 – xaxxon

+0

當我通過0xffff(純白色)它打印: r:255,g:255,b:255 這似乎是正確的或我完全錯過了這一點? – George

回答

0

這裏有一個解決方案:

void rgb(int rgbA, int rgbB) { 
    int ra = (rgbA&0xf800)>>11; 
    int ga = (rgbA&0x7e0)>>5; 
    int ba = rgbA&0x1f; 
    int rb = (rgbB&0xf800)>>11; 
    int gb = (rgbB&0x7e0)>>5; 
    int bb = rgbB&0x1f; 

    for (int i=0; i<16; i++) { 
     int r = (ra*(15-i) + rb*i + 7)/15; // + 7 is there to apply rounding 
     int g = (ga*(15-i) + gb*i + 7)/15; 
     int b = (ba*(15-i) + bb*i + 7)/15; 

     int result = r<<11|g<<5|b; 

     printf("%04x\n", result); 
    } 
} 
相關問題