更改用于绘制到位图的像素格式

时间:2012-05-31 13:02:10

标签: c++ .net opengl gdi

我需要在位图像素中交换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);

我尝试改变频道的转变,但它什么都不做。

1 个答案:

答案 0 :(得分:0)

由于您使用的是.NET和Windows - 请查看Monogame中的this位代码。它使用ColorMatrix转置颜色组件。根据我的经验,这种方法快速,可靠,灵活。

对于您的特定问题,虽然看起来您需要一种方法将VTK提供的RGBA图像转换为Bitmap所采用的BGRA。我在这里看到两个选项:

  1. 请求VTK渲染到BGRA位图(VTK中的某种SetPixelFormat调用?)
  2. 使用像素着色器在进行渲染时交换通道。这几乎没有相关的成本,看起来你还是在使用OpenGL。
  3. 希望这有帮助!