gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:06:43 26 4
gpt4 key购买 nike

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com