程序当中得到了一个bitmap的句柄(HBITMAP),
现在想把他输出成一个文件,以方便用photoshop只类的东西编辑,
怎么完成这个操作,高手指点 谢谢

解决方案 »

  1.   

    int SaveBitmapToFile(HBITMAP hBitmap ,  LPSTR lpFileName) //hBitmap 为刚才的屏幕位图句柄{      //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 < = 24)      wBitCount = 24;   //计算调色板大小   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, hPal, FALSE);      RealizePalette(hDC);   }   // 获取该调色板下新的像素值   GetDIBits(hDC, hBitmap, 0, (UINT) Bitmap.bmHeight,  (LPSTR)lpbi + sizeof(BITMAPINFOHEADER)    +dwPaletteSize,  (BITMAPINFOHEADER *)    lpbi, DIB_RGB_COLORS);   //恢复调色板      if (hOldPal)   {      SelectPalette(hDC, 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);}
      

  2.   

    转贴:with the IPicture interface, it is pretty easy
    void SaveBmp(HBITMAP hbmp, LPCTSTR sIconFileName)
    {
    if(hbmp==NULL || sIconFileName==NULL)
    return;
    //warning: this code snippet is not bullet proof.
    //do error check by yourself [masterz]
    PICTDESC picdesc;
    picdesc.cbSizeofstruct = sizeof(PICTDESC);
    picdesc.picType = PICTYPE_BITMAP ;    
    picdesc.bmp.hpal = NULL;
    picdesc.bmp.hbitmap = hbmp;
    IPicture* pPicture=NULL;
    OleCreatePictureIndirect(&picdesc, IID_IPicture, TRUE,(VOID**)&pPicture);
    LPSTREAM pStream;
    CreateStreamOnHGlobal(NULL,TRUE,&pStream);
    LONG size;
    HRESULT hr=pPicture->SaveAsFile(pStream,TRUE,&size);
    char pathbuf[1024];
    strcpy(pathbuf,sIconFileName);
    CFile iconfile;
    iconfile.Open(pathbuf, CFile::modeCreate|CFile::modeWrite);
    LARGE_INTEGER li;
    li.HighPart =0;
    li.LowPart =0;
    ULARGE_INTEGER ulnewpos;
    pStream->Seek( li,STREAM_SEEK_SET,&ulnewpos);
    ULONG uReadCount = 1;
    while(uReadCount>0)
    { pStream->Read(pathbuf,sizeof(pathbuf),&uReadCount);
    if(uReadCount>0)
    iconfile.Write(pathbuf,uReadCount);
    }
    pStream->Release();
    iconfile.Close();
    }