0

RGBAチャンネルをビットマップピクセルで交換する必要があります。たとえば、.netグラフィックスはチャネルをBGRAのビットマップに書き込み、RGBAが必要です。この順序はPIXELFORMATDESCRIPTORによって決定されると思いますが、方法がわかりません。私はフォローします

 PIXELFORMATDESCRIPTOR pfd = { 
            sizeof(PIXELFORMATDESCRIPTOR),   // size of this pfd  
            1,                     // version number  
            PFD_DRAW_TO_BITMAP |   // support window  
            PFD_SUPPORT_OPENGL | 
            PFD_NEED_PALETTE,       
            PFD_TYPE_COLORINDEX,         // RGBA type  
            32,                    // 24-bit color depth  
            8, 8, 8, 0, 0, 0,      // color bits ignored  
            8,                     // no alpha buffer  
            0,                     // shift bit ignored  
            0,                     // no accumulation buffer  
            0, 0, 0, 0,            // accum bits ignored  
            32,                    // 32-bit z-buffer  
            0,                     // no stencil buffer  
            0,                     // no auxiliary buffer  
            PFD_MAIN_PLANE,        // main layer  
            0,                     // reserved  
            0, 0, 0                // layer masks ignored  
        }; 


        int  iPixelFormat; 
  ::SelectObject ((HDC)_hdc.ToPointer (), (HBITMAP)_hBitmap.ToPointer ());

        iPixelFormat = ChoosePixelFormat((HDC)_hdc.ToPointer (), &pfd); 
    bool result = ::SetPixelFormat((HDC)_hdc.ToPointer (), iPixelFormat, &pfd);

チャンネルのシフトを変えようとしていますが、何もしません。

4

1 に答える 1

0

.NET と Windows を使用しているので、Monogame のこのコードを見てください。ColorMatrix を使用して色成分を転置します。私の経験では、この方法は高速で信頼性が高く、柔軟です。

あなたの特定の問題については、VTK が提供する RGBA イメージから Bitmap が取る BGRA に変換する方法が必要なようです。ここに 2 つのオプションがあります。

  1. VTK に BGRA ビットマップにレンダリングするように依頼します (VTK での SetPixelFormat 呼び出しのようなものですか?)
  2. レンダリング中にチャンネルを交換するピクセル シェーダーを使用します。これには関連するコストはほとんどなく、とにかく OpenGL を使用しているように見えます。

お役に立てれば!

于 2012-05-31T13:34:11.867 に答える