Могу ли я вывести одноканальное изображение, полученное с камеры, в окно winAppi? - PullRequest
0 голосов
/ 08 февраля 2019

У меня есть указатель на изображение, полученное с камеры, используя сторонний SDK.Изображение одной полосы (Mono 8).Я хочу вывести его как растровое изображение в окно winAppi.Что я делаю, это

        HBITMAP hBitmap = NULL;
        BITMAPINFOHEADER bmih;
        bmih.biSize = sizeof(BITMAPINFOHEADER);
        bmih.biWidth = 1280;
        bmih.biHeight = 960;
        bmih.biPlanes = 1;
        bmih.biBitCount = 8;
        bmih.biCompression = BI_RGB;
        bmih.biSizeImage = 0;
        bmih.biXPelsPerMeter = 0;
        bmih.biYPelsPerMeter = 0;
        bmih.biClrUsed = 0;
        bmih.biClrImportant = 0;

        BITMAPINFO dbmi;
        ZeroMemory(&dbmi, sizeof(dbmi));
        dbmi.bmiHeader = bmih;
        dbmi.bmiColors->rgbBlue = 0;
        dbmi.bmiColors->rgbGreen = 0;
        dbmi.bmiColors->rgbRed = 0;
        dbmi.bmiColors->rgbReserved = 0;

        void* bits = &aquiredImageCPU.m_sMemory.ptr()[0];

    hBitmap = CreateDIBitmap(dc, &bmih, CBM_INIT, bits, &dbmi, DIB_RGB_COLORS);


    src = CreateCompatibleDC(dc);
            SelectObject(src, hBitmap);
             BitBlt(dc, 10,10,512, 512, src, 0,   0,   SRCCOPY); 

Если я вывожу изображение в виде матрицы и предварительно с помощью моей библиотеки (библиотеки, в которой я использую imsave, аналогичную matlabs imsave), я вижу, что изображение в порядке (изображение в градациях серого),Но когда я вывожу его в окно winAppi, оно преобразуется в RGB.Я думаю, что это имеет отношение к

          HDC dc = GetDC(hwnd);
          src = CreateCompatibleDC(dc);  

Есть предложения?Спасибо

То, что я сделал в похожем случае, - это брать каждые 8 ​​битов и копировать их еще 2 раза после фрагмента из 8 битов.Это работает, но это дорого, и мне нужно настоящее приложение для плиток.

        auto outputImageHight = 1280;
        auto outputImageWidth = 960;
        unsigned char *myArray = new unsigned char[3 * outputImageHight * outputImageWidth];

        for (int i = 0; i < outputImageHight; i++)
        for (int j = 0; j < outputImageWidth; j++)
        {
        unsigned char ucTmp = (unsigned char)(image(i, j));

        myArray[3 * (i + outputImageHight * j) + 0] = ucTmp;
        myArray[3 * (i + outputImageHight * j) + 1] = ucTmp;
        myArray[3 * (i + outputImageHight * j) + 2] = ucTmp;
        }

1 Ответ

0 голосов
/ 08 февраля 2019

8-битное растровое изображение требует таблицы цветов.Так как вы хотите использовать оттенки серого, вы должны настроить таблицу цветов на 256 уровней серого.Вы установили первый на черный, что правильно, но вы не установили остальные.

BITMAPINFO на самом деле является структурой переменного размера.Поле bmiColors является просто заполнителем для первого цвета в таблице цветов.Вы должны выделить дополнительное пространство для всей таблицы цветов и заполнить ее.

std::size_t size = sizeof(BITMAPINFOHEADER) + 256*sizeof(RGBQUAD);
std::vector<char> buffer(size);
BITMAPINFO *dbmi = reinterpret_cast<BITMAPINFO *>(buffer.data());
ZeroMemory(dbmi, size); // probably unnecessary
dbmi->bmiHeader = bmih;
for (int i = 0; i < 256; ++i) {
  dbmi->bmiColors[i].rgbBlue = i;
  dbmi->bmiColors[i].rgbGreen = i;
  dbmi->bmiColors[i].rgbRed = i;
  dbmi->bmiColors[i].rgbReserved = 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...