2017-08-25 21 views
-1

X8B8G8R8のフォーマットのハードウェアピクセルバッファをunsigned int 24ビットメモリバッファに変換したいと考えています。あなたはそれがしたい場合はBGRtoRGBがここに両方の​​方法を変換し、それを覚えている:X8B8G8R8をR8G8B8に変換するC++コード

// pixels is uin32_t; 
src.pixels = new pixel_t[src.width*src.height]; 





    readbuffer->lock(Ogre::HardwareBuffer::HBL_DISCARD); 
      const Ogre::PixelBox &pb = readbuffer->getCurrentLock(); 

      /// Update the contents of pb here 
      /// Image data starts at pb.data and has format pb.format 
      uint32 *data = static_cast<uint32*>(pb.data); 
      size_t height = pb.getHeight(); 
      size_t width = pb.getWidth(); 
      size_t pitch = pb.rowPitch; // Skip between rows of image 
      for (size_t y = 0; y<height; ++y) 
      { 
       for (size_t x = 0; x<width; ++x) 
       { 
        src.pixels[pitch*y + x] = data[pitch*y + x]; 
       } 
      } 
+0

だから、あなたはどのような問題が発生しているのアルファを持つ、他の方法で回避を変換するには

? – auburg

+0

そして結果/問題は? – Matt

答えて

0

これは

uint32_t BGRtoRGB(uint32_t col) { 
    return (col & 0x0000ff00) | ((col & 0x000000ff) << 16) | ((col & 0x00ff0000) >> 16) 
} 

src.pixels[pitch*y + x] = BGRtoRGB(data[pitch*y + x]); 

注意して行う必要があります。ここでは

は私の試みです X8ビット(アルファ?)であなたが持っているものはすべて捨てますが、 uldは値自体を保持します。 0xff

uint32_t RGBtoXBGR(uint32_t col) { 
    return 0xff000000 | (col & 0x0000ff00) | ((col & 0x000000ff) << 16) | ((col & 0x00ff0000) >> 16) 
} 
+0

ありがとうございます。私は別のことがあります。どのようにしてrgbをxbgrに戻すのですか? – andre

+0

この関数は両方の方法を変換しますが、上位ビット( 'X8'?)を捨てます。あなたはこれらの8ビットをどこかから得る必要があります。 – N00byEdge

+0

変換された数字の上位8ビットを保持したい場合(私はあなたがそれを好きにするためにどのように使用しているかわかりません)、 '0x0000ff00'の最初のビットマスクを' 0xff00ff00'に変更しますそれは完全に対称である。 – N00byEdge

関連する問題