2012-05-31 1 views
0

Мне нужен обмен RGBA-каналом в растровых пикселях. Например, графические записи .net записывают каналы в растровые изображения в BGRA, и мне нужен RGBA. Я думаю, что этот порядок определен PIXELFORMATDESCRIPTOR, но я не знаю, как это сделать. I do folowИзменение формата пикселя для рисования в растровое изображение

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); 

Я пытаюсь изменить смену каналов, но ничего не делать.

ответ

0

Поскольку вы используете .NET и Windows - посмотрите на код this из Monogame. Он использует ColorMatrix для переноса цветовых компонентов. Этот метод является быстрым, надежным и гибким в моем опыте.

Для вашей конкретной проблемы, хотя похоже, что вам нужен способ конвертировать из изображений RGBA, поставляемых VTK в BGRA, которые принимает Bitmap. Я вижу два варианта здесь:

  1. Ask VTK для визуализации в растровое BGRA
  2. Использование пиксельный шейдер, который меняет местами каналы, делая рендеринг (своего рода SetPixelFormat вызова в ВТК?). Это вряд ли будет связано со стоимостью, и похоже, что вы используете OpenGL в любом случае.

Надеюсь, это поможет!

+0

Спасибо за ответ. Это может помочь, если я рисую только изображения в растровое изображение, но рисую линии, прямоугольники и т. Д. По этому я мог бы перерисовать растровое изображение с помощью ColorMap, но это изображение дважды, и это не обязательно, потому что я могу поменять свои каналы непосредственно в памяти. Я думаю о чем-то вроде цветовой карты в режиме рисования. –

+0

Зачем вам нужно транспонировать биты каждый раз, когда вы рисуете что-то? Недостаточно ли этого сделать один раз - либо в начале, либо в конце? Что именно ты пытаешься сделать? – Ani

+0

Я использую библиотеку vtk для визуализации этого растрового изображения и vtk, использующего цветовую схему RGBA растрового изображения, вместо BGRA, которые дают мне графику после рисования. Теперь перед визуализацией непосредственно подкачки B и R. –

Смежные вопросы