【发布时间】:2020-10-11 07:38:07
【问题描述】:
我正在尝试创建一个 C++ 应用程序,它实际上从放大镜中捕获位图并使用 Direct 2d 进行渲染。
我目前拥有将位图从放大镜保存到文件的代码。但我需要做的是使用直接 2d 将该位图绘制到我的窗口,而不是将其保存到文件中。
放大镜以 MAGIMAGEHEADER 的形式将图像作为结构返回,我能够从中获取 BITMAPINFOHEADER 和字节。我需要使用直接 2D 将其渲染到窗口。
这是用于从 Magnifier API 获取 BITMAPINFOHEADER 和字节的代码
BOOL MagImageScaling(HWND hwnd, void *srcdata, MAGIMAGEHEADER srcheader, void *destdata, MAGIMAGEHEADER destheader,RECT unclipped, RECT clipped, HRGN dirty)
{
// Setup the bitmap info header
bmif.biSize = sizeof(BITMAPINFOHEADER);
bmif.biHeight = srcheader.height;
bmif.biWidth = srcheader.width;
bmif.biSizeImage = srcheader.cbSize;
bmif.biPlanes = 1;
bmif.biBitCount = (WORD)(bmif.biSizeImage / bmif.biHeight / bmif.biWidth * 8);
bmif.biCompression = BI_RGB;
// Prepare the buffer
if (pData != NULL)
{
delete pData;
pData = NULL;
}
pData = (BYTE*)malloc(bmif.biSizeImage);
memcpy(pData, srcdata, bmif.biSizeImage);
// The data bit is in top->bottom order, so we convert it to bottom->top order
LONG lineSize = bmif.biWidth * bmif.biBitCount / 8;
BYTE* pLineData = new BYTE[lineSize];
BYTE* pStart;
BYTE* pEnd;
LONG lineStart = 0;
LONG lineEnd = bmif.biHeight - 1;
while (lineStart < lineEnd)
{
// Get the address of the swap line
pStart = pData + (lineStart * lineSize);
pEnd = pData + (lineEnd * lineSize);
// Swap the top with the bottom
memcpy(pLineData, pStart, lineSize);
memcpy(pStart, pEnd, lineSize);
memcpy(pEnd, pLineData, lineSize);
// Adjust the line index
lineStart++;
lineEnd--;
}
delete pLineData;
// Set the flag to say that the callback function is finished
bCallbacked = TRUE;
return TRUE;
}
这里的变量 bmif 是 BITMAPINFOHEADER 并且 pData 是字节数 有什么方法可以实现吗?
【问题讨论】:
-
代码具有未定义的行为,因为您将
delete与malloc混合在一起。在调用new []时,您还使用了错误形式的delete。应该是delete[]。 -
实际上这段代码是有效的,但我需要实现的是不同的。我添加它以显示示例
-
对于 Direct2D,您必须创建一个 Direct2D 位图:ID2D1Bitmap。您可以从 Direct2D 渲染目标创建它,例如,当内存中有像素时,docs.microsoft.com/en-us/windows/win32/api/d2d1/…。你的 Direct2D 代码在哪里?
-
我还没有完成直接二维码,因为我不知道如何将此数据转换为 ID2D1 位图。无论如何,代码与我的其他问题之一相同。stackoverflow.com/questions/63381368/…
-
使用适当的格式(如 DXGI_FORMAT_R8G8B8A8_UNORM 左右)调用 renderTarget.CreateBitmap,然后从像素缓冲区调用 bitmap.CopyFromMemory,然后调用 renderTarget.DrawBitmap
标签: c++ bitmap directx win32gui direct2d