所以我想做的是让我的程序截屏并将其保存在计算机上。稍后将对实际截取屏幕截图进行编程,我首先尝试解决如何在计算机上实际保存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/

10-10 04:27