2

我正在使用 Rainbowduino,它有一些方法将单个 rgb 值作为无符号字符,还有一些采用 24 位 rgb 颜色代码。

我想将 rgb 值转换为 uint32_t 类型的 24 位颜色代码(这样我的所有代码都只需要使用 rgb 值。

有任何想法吗?

我已经尝试过 uint32_t result = r << 16 + g << 8 + b; r = 100 g =200 b=0 给出绿色,但 r=0 g=200 b=0 没有给出任何结果

Rb.setPixelXY(unsigned char x, unsigned char y, unsigned char colorR, unsigned char colorG, unsigned char colorB)
This sets the pixel(x,y)by specifying each channel(color) with 8bit number.

Rb.setPixelXY(unsigned char x, unsigned char y, unit32_t colorRGB) 
This sets the pixel(x,y)by specifying a 24bit RGB color code.
4

2 回答 2

3

驱动代码为:

void Rainbowduino::setPixelXY(unsigned char x, unsigned char y, uint32_t colorRGB /*24-bit RGB Color*/)
{
    if(x > 7 || y > 7)
    {
     // Do nothing.
     // This check is used to avoid writing to out-of-bound pixels by graphics function. 
     // But this might slow down setting pixels (remove this check if fast disply is desired)
    }
    else
    {
    colorRGB = (colorRGB & 0x00FFFFFF);
    frameBuffer[0][x][y]=(colorRGB & 0x0000FF); //channel Blue
    colorRGB = (colorRGB >> 8);
    frameBuffer[1][x][y]=(colorRGB & 0x0000FF); //channel Green
    colorRGB = (colorRGB >> 8);
    frameBuffer[2][x][y]=(colorRGB & 0x0000FF); //channel Red
    }
}

所以我会认为与上述类似:

uint8_t x,y,r,b,g;
uint32_t result = (r << 16) | (g << 8) | b;
Rb.setPixelXY(x, y, result); 

应该管用。我认为上面可能需要括号,以确保正确排序,因为“+”高于“<<”。也可能不会受伤,但“|” 更好,以免防止不受欢迎的进位。

PS请记住,当移位为无符号时,除非您想要算术移位与逻辑移位。在这点上,我不喜欢轮班,因为它们经常混乱且效率低下。相反,联合是简单而有效的。

union rgb {
  uint32_t word;
  uint8_t  byte[3];
  struct {
    uint8_t  blue;
    uint8_t  green;
    uint8_t  red;
  } color ;
}rgb ;

// one way to assign by discrete names.
rbg.color.blue = b;
rbg.color.green = g;
rbg.color.red = r;
//or assign using array
rgb.byte[0] = b;
rgb.byte[1] = g;
rgb.byte[2] = r;
// then interchangeably use the whole integer word when desired.
Rb.setPixelXY(x, y, rgb.word); 

不要搞乱跟踪班次。

于 2013-02-26T21:46:25.523 回答
0

解决此问题的一种方法是将位向左移动...

uint32_t result = r << 16 + g << 8 + b;
于 2013-02-26T20:13:08.637 回答