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

これにアプローチする1つの方法は、ビットを左にシフトすることです...

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