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。我在这里看到两个选项:

  1. 要求 VTK 渲染成 BGRA 位图(VTK 中的某种 SetPixelFormat 调用?)
  2. 使用在进行渲染时交换通道的像素着色器。这几乎没有任何相关成本,而且看起来您无论如何都在使用 OpenGL。

希望这可以帮助!

于 2012-05-31T13:34:11.867 回答