Отображение 32-битного растрового изображения - палитра - PullRequest
0 голосов
/ 09 июля 2009

У меня есть данные изображения в буфере (тип - длинный) со сканера, который является 32-битным.

Например, соответствующее значение пикселя буфера [0] равно 952, что составляет [184, 3, 0, 0] <- [R, G, B, A]; </p>

Я хочу отобразить / нарисовать / нарисовать на экране; Я запутался, когда попытался прочитать о растровых изображениях. Я посмотрел на функции win32, класс CBitmap, формы окон (графическое окно) и т. Д. Мне трудно понять общую идею / аппроксимацию отображения этих данных буфера в окне приложения.

Я построил BITMAPFILEHEADER И BITMAPINFOHEADER; Содержит данные пикселей в буфере (без знака char *) vInBuff, размер которого равен vImageSz;

//construct the BMP file Header
vBmfh.bfType      = 19778;
vBmfh.bfSize      = 54+vImageSz;//size of the whole image
vBmfh.bfReserved2 = 0;
vBmfh.bfReserved1 = 0;
vBmfh.bfOffBits   = 54;//offset from where the pixel data can be found
//Construct the BMP info header
vBmih.biSize        = 40;//size of header from this point
vBmih.biWidth       = 1004;
vBmih.biHeight      = 1002;
vBmih.biPlanes      = 1;
vBmih.biCompression = BI_RGB;
vBmih.biSizeImage   = vBmih.biWidth*vBmih.biHeight*4;
vBmih.biBitCount    = 32;
vBmih.biClrUsed     = 0;
vBmih.biClrUsed     = 0;

1.Что я должен делать дальше, чтобы отобразить это?

2 Что я должен использовать для отображения 32-битного растрового изображения? Я вижу людей, использующих функции createwindows, формы Windows, MFC и т. Д .;

3. Я также понимаю, что используются BitBlt, createDIBSection, OnPaint и т. Д.? Я смущен этими различными функциями и платформами кодирования? Пожалуйста, предложите мне простой подход.

4.Как я могу создать палитру для отображения 32-битного изображения?

Спасибо

Raj
EDITED ПЫТАЯСЬ СОДЕРЖАТЬ ДАЙВ ПОДХОД, МОЖЕТ КТО-ТО КОММЕНТАРИЙ НА МОЕ РЕАЛИЗАЦИЮ. Я не мог продолжать битблт, так как у меня нет двух HDC, я не знаю, как получить этот? Любая помощь, пожалуйста

DisplayDataToImageOnScreen(unsigned char* vInBuff, int vImageSz)  // buffer with pixel data, Size of pixel data
{
unsigned char* vImageBuff = NULL;

HDC hdcMem=CreateCompatibleDC(NULL); 

HBITMAP hBitmap = CreateDIBSection(hdcMem, 
                                   (BITMAPINFO*)&vBmih, 
                                   DIB_RGB_COLORS,
                                   (void **)&vImageBuff, 
                                   NULL, 0);

GetDIBits(hdcMem,
          hBitmap,
               0,
               1,
         (void**)&vImageBuff,
         (BITMAPINFO*)&vBmih,
         DIB_RGB_COLORS);

memcpy(vImageBuff,vInBuff,vImageSz);

}

Ответы [ 4 ]

1 голос
/ 09 июля 2009

Альтернативой, если вы просто хотите отобразить его на экране, является использование TinyPTC (http://sourceforge.net/projects/tinyptc/files/). Это всего лишь 3 функции и очень просто, если вы просто хотите построить несколько пикселей.

РЕДАКТИРОВАТЬ: Похоже, http://www.pixeltoaster.com является продолжением TinyPTC, вероятно, предпочтительнее.

1 голос
/ 09 июля 2009

Если у вас уже есть байты изображения в буфере, вы можете использовать:

объект CBitmap (MFC) и метод CBitmap :: CreateBitmapIndirect
или
Подпрограмма win32 CreateBitmapIndirect .

Теперь вы можете использовать BitBlt , чтобы нарисовать его на DC . Чтобы получить окно DC, используйте GetDC .

Нет необходимости создавать палитру для 32-битных изображений.

0 голосов
/ 09 июля 2009

Вот упрощенный подход, который вы можете попробовать, разбитый на шаги:

BITMAPINFO bitmapinfo = { 0 };
bitmapinfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bitmapinfo.bmiHeader.biWidth = 1004;
bitmapinfo.bmiHeader.biHeight = -1002;
bitmapinfo.bmiHeader.biPlanes = 1;
bitmapinfo.bmiHeader.biCompression = BI_RGB;

HBITMAP hBitmap = CreateDIBSection(NULL, 
                                   &bitmapinfo, 
                                   DIB_RGB_COLORS,
                                   (void **)&vImageBuff,
                                   NULL,
                                   0);

Теперь присоединитесь к vImageBuff, а затем кешируйте hBitmap куда-нибудь так, чтобы в вашем wndproc вы могли затем в обработчике WM_PAINT:

  1. выберите hBitmap во временную HDC
  2. вызов BitBlt (..., SRCCOPY) с совместимого HDC на HDC окна. другие параметры должны быть очевидны. не пытайтесь сначала потянуться или сделать что-нибудь причудливое.
  3. не забудьте выбрать исходный фиктивный битовый массив во временный HDC перед его уничтожением.

Если вы не видите результатов, попробуйте перебрать vImageBuff и просто установить для каждого пикселя значение RGB (255, 0, 0) или что-то в этом роде, просто для проверки работоспособности проверьте остальную логику.

Если ничто не рисует, убедитесь, что альфа-компонент для каждого пикселя равен 255.

Если вы получаете искаженное изображение, то вам необходимо еще раз проверить формат пикселя, шаг и т. Д.

0 голосов
/ 09 июля 2009

Вот стратегия, которая вам может понравиться:

Создайте растровое изображение того же размера, что и отсканированные данные, и того же формата (используйте CreateDIBSection).

Используйте GetDIBits для получения базового адреса данных пикселей.

Скопируйте ваши данные (со сканера) на адрес, который возвращает GetDIBits.

Теперь рендеринг вашего растрового изображения! (используйте BitBlt или что-то подобное).

Что касается палитр - 32-битное изображение, как правило, не имеет явной палитры - вам понадобится 16,7 миллионов (при условии 8 бит альфа) значений в палитре. Обычно предполагается, что палитра имеет 8-битный красный, 8-битный зеленый и 8-битный синий, как вы описали выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...