c++ - 我可以将从相机获取的单 channel 图像输出到 winAppi 窗口吗?

标签 c++ winapi

我有一个指向使用第三方 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); 

如果我将图像输出为矩阵并使用我的库(我在其中使用类似于 matlabs imsave 的 imsave 的库)将其作为矩阵输出,我可以看到图像正常(灰度图像)。但是当我将它输出到 winAppi 窗口时,它会将它转换为 RGB。我认为这与

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

有什么建议吗? 谢谢

在类似的情况下,我所做的是每 8 位取一次,然后在 8 位 block 之后再复制 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++ - 我可以将从相机获取的单 channel 图像输出到 winAppi 窗口吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54592759/

相关文章:

c++ - CMake:如何传递预处理器宏

c++ - GCC 生成了未对齐的 "ldrd"指令

c++ - 按 F10 导致 WM_SETCURSOR 消息

c++ - 如何用c++获取标题栏的实际高度

C++ 求函数的根

java - 字节数组的 JNI 内存泄漏

c++ - 大量努力布局 DirectX 和窗口

visual-studio-2010 - 有人在 Windows 7 上成功安装 Nodejs Soap 吗?

c# - 如何在 Windows 中打开/关闭 radio ?

c++ - 合并没有空格的文件比有空格更快