我可以将从相机获取的单通道图像输出到 winAppi 窗口中吗?

Can I output a one channel image acquired from camera into a winAppi window?

本文关键字:输出 图像 winAppi 窗口 通道 相机 获取 单通道 我可以      更新时间:2023-10-16

我有一个指向使用第三方SDK从相机获取的图像的指针。图像为一个波段(单声道 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 位取一次,并在 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;
}