阅读背景:

windows gdi - 保存bitmap_jcyangzh的专栏_windows 保存bitmap

来源:互联网 
bool SaveBMP(HDC hdc, const tstring& filePath)
{
    HBITMAP hbm = (HBITMAP)GetCurrentObject(hdc, OBJ_BITMAP);
    assert(hbm);
    return SaveBMP(hbm, filePath);
}

bool SaveBMP(HBITMAP hbm, const tstring& filePath)
{
    LPBYTE pBitmap = NULL;
    bool bAlloc = false;

    BITMAP bm = {0};
    assert(GetObject(hbm, sizeof(BITMAP), &bm));
    assert(bm.bmWidth && bm.bmHeight);

    if (!bm.bmBits)
    {
        LONG size = bm.bmWidthBytes * bm.bmHeight;
        pBitmap = new BYTE[size];
        bAlloc = true;
        assert(GetBitmapBits(hbm, size, pBitmap) == size);
    } else
    {
        pBitmap = (LPBYTE)bm.bmBits;
    }

    BITMAPFILEHEADER bfh = {0};
    bfh.bfType = 0x4d42;
    bfh.bfSize = bm.bmWidthBytes * bm.bmHeight + sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
    bfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);

    BITMAPINFO bmi = {0};
    bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);    
    bmi.bmiHeader.biWidth = bm.bmWidth;
    bmi.bmiHeader.biHeight =  - bm.bmHeight;
    bmi.bmiHeader.biPlanes = bm.bmPlanes;    
    bmi.bmiHeader.biBitCount = bm.bmBitsPixel;    
    bmi.bmiHeader.biCompression = BI_RGB;    
    bmi.bmiHeader.biSizeImage = bm.bmWidthBytes * bm.bmHeight;  
    bmi.bmiHeader.biXPelsPerMeter = 0;    
    bmi.bmiHeader.biYPelsPerMeter = 0;    
    bmi.bmiHeader.biClrUsed = 0;    
    bmi.bmiHeader.biClrImportant = 0;

    FILE *fp = NULL;
    _tfopen_s(&fp, filePath.c_str(), _T("wb"));
    assert(fp);
    size_t writeCount = fwrite(&bfh, sizeof(BITMAPFILEHEADER), 1, fp);
    assert(writeCount == 1);
    writeCount = fwrite(&bmi, sizeof(BITMAPINFOHEADER), 1, fp);
    assert(writeCount == 1);
    writeCount = fwrite(pBitmap, bmi.bmiHeader.biSizeImage, 1, fp);
    assert(writeCount == 1);
    fclose(fp);

    if (bAlloc && pBitmap)
        delete [] pBitmap;

    return true;
} 
bool SaveBMP(HDC hdc, const tstring& filePath)



你的当前访问异常,请进行认证后继续阅读剩余内容。

分享到: