c – 我可以将从摄像头获取的单通道图像输出到winAppi窗口吗?

我有一个指向使用第三方SDK从acamera获取的图像的指针.图像是一个波段(Mono 8).我想将它作为bittmap输出到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位并在8位的块后再复制2次.这是有效的,但它是昂贵的,我需要一个真正的瓷砖应用程序.

        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;
        }
最佳答案
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;
}

转载注明原文:c – 我可以将从摄像头获取的单通道图像输出到winAppi窗口吗? - 代码日志