如何获取 BITMAPFILEHEADER 和 BITMAPINFOHEADER 的字节表示形式?
How do I get the byte representation of a BITMAPFILEHEADER and BITMAPINFOHEADER?
我正在尝试使用代码截取计算机屏幕的屏幕截图,然后将该图像的 BYTE 存储到数组中,而不是使用以下函数立即保存图像:
void WINAPI CaptureScreenIntoByteArray(
BYTE*& screen_bytes,
DWORD& screen_bytes_size)
{
BITMAPFILEHEADER bfHeader;
BITMAPINFOHEADER biHeader;
BITMAPINFO bInfo;
HGDIOBJ hTempBitmap;
HBITMAP hBitmap;
BITMAP bAllDesktops;
HDC hDC, hMemDC;
LONG lWidth, lHeight;
BYTE* sb = NULL;
ZeroMemory(&bfHeader, sizeof(BITMAPFILEHEADER));
ZeroMemory(&biHeader, sizeof(BITMAPFILEHEADER));
ZeroMemory(&bInfo, sizeof(BITMAPINFO));
ZeroMemory(&bAllDesktops, sizeof(BITMAP));
hDC = GetDC(NULL);
hTempBitmap = GetCurrentObject(hDC, OBJ_BITMAP);
GetObjectW(hTempBitmap, sizeof(BITMAP), &bAllDesktops);
lWidth = bAllDesktops.bmWidth;
lHeight = bAllDesktops.bmHeight;
DeleteObject(hTempBitmap);
bfHeader.bfType = (WORD)('B' | ('M' << 8));
bfHeader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
biHeader.biSize = sizeof(BITMAPINFOHEADER);
biHeader.biBitCount = 24;
biHeader.biCompression = BI_RGB;
biHeader.biPlanes = 1;
biHeader.biWidth = lWidth;
biHeader.biHeight = lHeight;
bInfo.bmiHeader = biHeader;
screen_bytes_size = (((24 * lWidth + 31) & ~31) / 8) * lHeight;
hMemDC = CreateCompatibleDC(hDC);
hBitmap = CreateDIBSection(hDC, &bInfo, DIB_RGB_COLORS, (VOID**)&sb, NULL, 0);
SelectObject(hMemDC, hBitmap);
int x = GetSystemMetrics(SM_XVIRTUALSCREEN);
int y = GetSystemMetrics(SM_YVIRTUALSCREEN);
BitBlt(hMemDC, 0, 0, lWidth, lHeight, hDC, x, y, SRCCOPY);
// Need to also copy bfHeader & biHeader bytes somehow...
screen_bytes = new BYTE[screen_bytes_size];
std::copy(sb, sb + screen_bytes_size, screen_bytes);
DeleteDC(hMemDC);
ReleaseDC(NULL, hDC);
DeleteObject(hBitmap);
}
我的具体问题是我还需要将 bfHeader 和 biHeader 保存到字节数组中(以便以后我可以将图像另存为文件(......所以这是问题领域...
// Need to also copy bfHeader & biHeader bytes somehow...
screen_bytes = new BYTE[screen_bytes_size];
std::copy(sb, sb + screen_bytes_size, screen_bytes);
如何将 bfHeader 和 biHeader 字节复制到数组中?
如果需要,这就是您调用函数的方式...
BYTE* screen_bytes = NULL;
DWORD screen_bytes_size = 0;
CaptureScreenIntoByteArray(screen_bytes, screen_bytes_size);
您还需要使数组足够大以容纳两个结构。
screen_bytes = new BYTE[sizeof(BITMAPFILEHEADER) + sizeof (BITMAPINFOHEADER) + screen_bytes_size];
然后,您可以将两个结构复制到数组的前面:
std::copy(&bfHeader, &bfHeader + 1, (BITMAPFILEHEADER*)screen_bytes);
std::copy(&biHeader, &biHeader + 1, (BITMAPINFOHEADER*)(screen_bytes + sizeof(BITMAPFILEHEADER)));
并在两个结构之后复制图像数据。
std::copy(sb, sb + screen_bytes_size, screen_bytes + sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER));
相关文章:
- 是否可以保证按字节的零 int 是零的表示形式?
- 如何获取 BITMAPFILEHEADER 和 BITMAPINFOHEADER 的字节表示形式?
- C++ CUDA:如何将字节表示为字符或字符集?
- 如何在 c++ 中将字节转换为 ASCII 十六进制表示形式?
- 我想发送固定数量的字节来表示可以解析为整数值的数值
- 如何编写一个字节表示为c 中的文件
- 计算表示有符号整数所需的最小字节数
- 如何将一个数字(大于8个字节)从字符阵列转换为其ASCII表示
- 来自向量 c++ 中的字节表示
- std::wstring中ASCII符号的字节表示,具有不同的语言环境
- 变量的字节表示的意外结果
- 使用 uint8_t 或 char 来表示以字节排列的二进制数据更好吗?
- 显示非常大的数字,用字节[]表示
- 在std::向量中表示原始字节的最佳方式
- C++ 分配期间 NaN 字节表示形式发生变化
- 使用C++将字符转换为字节表示
- 在C/ c++中有一个简短的字节表示法吗?
- Visual Studio 2008中命令行参数的2字节表示
- 数字的字节表示
- C++在不进行*序列化的情况下获取unsodered_set*的字节表示