我已经有图像数据了,是裸数据,我想借用HBITMAP类将该数据保存为BMP文件,该怎么做啊?大家帮帮我!

解决方案 »

  1.   

    要根据BMP文件存储的格式进行处理。
    需要一个BMP文件头信息,然后才是
    位图数据。
      

  2.   

    http://www.paintlib.de/paintlib/
    你可以参考一下这个类
      

  3.   

    这是别人的程序,你看看,或许对你有帮助
    ///////////将内存中的BMP文件内容转换到HBITMAP///////
    HBITMAP bitmap;
    LPSTR hDIB,lpBuffer;
    LPVOID lpDIBBits;
    BITMAPFILEHEADER bmfHeader;
    DWORD bmfHeaderLen;bmfHeaderLen = sizeof(bmfHeader);
    strncpy((LPSTR)&bmfHeader,(LPSTR)lpBuffer,bmfHeaderLen);
    if (bmfHeader.bfType != ((WORD) ('M' << 8) | 'B')) 
       return;
    hDIB = lpBuffer + bmfHeaderLen;
    BITMAPINFOHEADER &bmiHeader = *(LPBITMAPINFOHEADER)hDIB ;
    BITMAPINFO &bmInfo = *(LPBITMAPINFO)hDIB ;
    int nColors = bmiHeader.biClrUsed ? bmiHeader.biClrUsed : 1 << bmiHeader.biBitCount; 
    if( bmInfo.bmiHeader.biBitCount > 8 )
       lpDIBBits = (LPVOID)((LPDWORD)(bmInfo.bmiColors + bmInfo.bmiHeader.biClrUsed) + 
    ((bmInfo.bmiHeader.biCompression == BI_BITFIELDS) ? 3 : 0));
    else
      lpDIBBits = (LPVOID)(bmInfo.bmiColors + nColors);bitmap = CreateDIBitmap(dc.m_hDC,&bmiHeader,CBM_INIT,lpDIBBits,&bmInfo,DIB_RGB_COLORS);
    lpBuffer是内存中BMP的数据
      

  4.   

    已知一个bmp图片的HBITMAP把它存为.bmp文件
    //try this code
    //lpfilename 为位图文件名,hbitmap 为刚才的屏幕位图句柄
    int SaveBitmapToFile(HBITMAP hbitmap , LPSTR lpfilename)

    HDC hdc; //设备描述表
    int ibits; 
    WORD wbitcount;  //当前显示分辨率下每个像素所占字节数//位图中每个像素所占字节数,定义调色板大小,位图中像素字节大小,位图文件大小 ,写入文件字节数
    DWORD dwpalettesize=0, dwbmbitssize, dwdibsize, dwwritten;BITMAP bitmap; //位图属性结构
    BITMAPFILEHEADER bmfhdr; //位图文件头结构
    BITMAPINFOHEADER bi; //位图信息头结构
    LPBITMAPINFOHEADER lpbi; //指向位图信息头结构//定义文件,分配内存句柄,调色板句柄
    HANDLE fh, hdib, hpal,holdpal=NULL;//计算位图文件每个像素所占字节数
    hdc = CreateDC("display",NULL,NULL,NULL);
    ibits = GetDeviceCaps(hdc, BITSPIXEL) * GetDeviceCaps(hdc, PLANES);
    DeleteDC(hdc);if (ibits <= 1)
    wbitcount = 1;
    else if (ibits <= 4)
    wbitcount = 4;
    else if (ibits <= 8)
    wbitcount = 8;
    else if (ibits <= 16)
    wbitcount = 16;
    else if (ibits <= 24)
    wbitcount = 24;
    else 
    wbitcount = 32;//计算调色板大小
    if (wbitcount <= 8)
    dwpalettesize = (1 << wbitcount) * sizeof(RGBQUAD);//设置位图信息头结构
    GetObject(hbitmap, sizeof(BITMAP), (LPSTR)&bitmap);
    bi.biSize = sizeof(BITMAPINFOHEADER);
    bi.biWidth = bitmap.bmWidth;
    bi.biHeight = bitmap.bmHeight;
    bi.biPlanes = 1;
    bi.biBitCount = wbitcount;
    bi.biCompression = BI_RGB;
    bi.biSizeImage = 0;
    bi.biXPelsPerMeter = 0;
    bi.biYPelsPerMeter = 0;
    bi.biClrUsed = 0;
    bi.biClrImportant = 0;dwbmbitssize = ((bitmap.bmWidth * wbitcount+31)/32)* 4 * bitmap.bmHeight ;
    //为位图内容分配内存
    hdib = GlobalAlloc(GHND,dwbmbitssize + dwpalettesize + 
    sizeof(BITMAPINFOHEADER));
    lpbi = (LPBITMAPINFOHEADER)GlobalLock(hdib);
    *lpbi = bi;// 处理调色板 
    hpal = GetStockObject(DEFAULT_PALETTE);
    if (hpal)
    {
    hdc = ::GetDC(NULL);
    holdpal = SelectPalette(hdc, (HPALETTE)hpal, false);
    RealizePalette(hdc);
    }// 获取该调色板下新的像素值
    GetDIBits(hdc, hbitmap, 0, (UINT) bitmap.bmHeight,(LPSTR)lpbi + 
    sizeof(BITMAPINFOHEADER)+dwpalettesize,(BITMAPINFO*)lpbi, DIB_RGB_COLORS);//恢复调色板 
    if (holdpal)
    {
    SelectPalette(hdc, (HPALETTE)holdpal, true);
    RealizePalette(hdc);
    ::ReleaseDC(NULL, hdc);
    }//创建位图文件 
    fh = CreateFile(lpfilename, GENERIC_WRITE, 0, NULL,
      CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL|
    FILE_FLAG_SEQUENTIAL_SCAN, NULL);
    if (fh == INVALID_HANDLE_VALUE)
    return false;// 设置位图文件头
    bmfhdr.bfType = 0x4d42; // "bm"
    dwdibsize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)+ 
    dwpalettesize + dwbmbitssize; 
    bmfhdr.bfSize = dwdibsize;
    bmfhdr.bfReserved1 = 0;
    bmfhdr.bfReserved2 = 0;
    bmfhdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + 
    (DWORD)sizeof(BITMAPINFOHEADER)+ dwpalettesize;// 写入位图文件头
    WriteFile(fh, (LPSTR)&bmfhdr, sizeof(BITMAPFILEHEADER), &dwwritten, NULL);// 写入位图文件其余内容
    WriteFile(fh, (LPSTR)lpbi, dwdibsize, &dwwritten, NULL);
    //清除 
    GlobalUnlock(hdib);
    GlobalFree(hdib);
    CloseHandle(fh);
    return true;
    }