所以我想做的是让我的程序截屏并将其保存在计算机上。稍后将对实际截取屏幕截图进行编程,我首先尝试解决如何在计算机上实际保存bmp文件的问题。我发现以下代码可以帮助我解决这个问题:
// szPathName : Specifies the pathname
// lpBits : Specifies the bitmap bits
// w : Specifies the image width
// h : Specifies the image height
bool SaveImage(char* szPathName, void* lpBits, int w, int h)
{
//Create a new file for writing
FILE *pFile = fopen(szPathName, "wb");
if(pFile == NULL)
{
return false;
}
BITMAPINFOHEADER BMIH;
BMIH.biSize = sizeof(BITMAPINFOHEADER);
BMIH.biSizeImage = w * h * 3;
// Create the bitmap for this OpenGL context
BMIH.biSize = sizeof(BITMAPINFOHEADER);
BMIH.biWidth = w;
BMIH.biHeight = h;
BMIH.biPlanes = 1;
BMIH.biBitCount = 24;
BMIH.biCompression = BI_RGB;
BMIH.biSizeImage = w * h* 3;
BITMAPFILEHEADER bmfh;
int nBitsOffset = sizeof(BITMAPFILEHEADER) + BMIH.biSize;
LONG lImageSize = BMIH.biSizeImage;
LONG lFileSize = nBitsOffset + lImageSize;
bmfh.bfType = 'B'+('M'<<8);
bmfh.bfOffBits = nBitsOffset;
bmfh.bfSize = lFileSize;
bmfh.bfReserved1 = bmfh.bfReserved2 = 0;
//Write the bitmap file header
UINT nWrittenFileHeaderSize = fwrite(&bmfh, 1,
sizeof(BITMAPFILEHEADER), pFile);
//And then the bitmap info header
UINT nWrittenInfoHeaderSize = fwrite(&BMIH,
1, sizeof(BITMAPINFOHEADER), pFile);
//Finally, write the image data itself
//-- the data represents our drawing
UINT nWrittenDIBDataSize =
fwrite(lpBits, 1, lImageSize, pFile);
fclose(pFile);
return true;
}
那么问题是什么。。。。嗯,我不明白varialbe IpBits。在代码注释中有一个lpBits的简要说明(lpBits:指定位图位)...但是我不知道这实际上意味着什么。我尝试进入msdn并研究了fopen和fclose函数,因为fclose是最终将使用传递给SaveImage函数的lpbits的函数....而且fclose函数中的lpBits变量似乎取决于在fopen函数中传递了什么变量。我试图找出fopen函数的“wb”是什么意思,但是没有成功(即使在msdn上搜索)。
问题:如果我在上一代码中的fopen函数中将“wb”用作第二个变量,那么fclose函数中的lpBits到底是什么?当我问它到底是什么时,我的意思是……它是什么类型的变量(在代码中,它被放置为void *,这基本上使它可以是任何变量),我希望您能提供任何反馈。
谢谢你们!
最佳答案
lpBits引用大小为lImageSize的字节数组。
数组的每个字节将包含一个单一的颜色分量,其顺序为:B,G和R:每个像素占用三个字节,每个颜色分量一个。
请注意,您发布的代码未考虑每个图像行的4个字节对齐。每个图像的行必须在4个字节的边界上对齐,因此lImageSize的正确公式为:
lImageSize = h * ((w * 3 + 3) & 0xfffffffc);
您可以自己创建lpbit:
lpbits = new BYTE[lImageSize];
或使用Logicrat的答案中所述的
CreateDIBSection()
关于c++ - C++保存位图文件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24944168/