在现给分最好给出代码!

解决方案 »

  1.   

    直接搜索一个CDIB类就应该有这样的功能
      

  2.   

    CDib::BOOL SaveFile(HGLOBAL hDib, CFile& file),那如何将第一个参数转化成BITMAPINFO 结构呢!
      

  3.   

    你怎么读的就怎么去保存!!
    可参考一下:
    void CXXXView::OnFileOpen() 
    {
    // TODO: Add your command handler code here
    CFileDialog dlg(TRUE,_T("BMP"),_T("*.BMP"),OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,_T("BMP Files (*.bmp)|*.bmp"),NULL);
    CString fileName; if(dlg.DoModal()==IDCANCEL)
    return ;
    fileName=dlg.GetPathName();
    CFile bitmapFile;
    CFileException fileException;
    if(!bitmapFile.Open(fileName,CFile::modeRead,&fileException))
    {
    TRACE("Can't open file %s,error=%u\n",fileName,fileException.m_cause);
    } m_pBmpFileHeader=(BITMAPFILEHEADER*) new char [sizeof(BITMAPFILEHEADER)];//给文件信息头分配内存
    bitmapFile.Read(m_pBmpFileHeader,sizeof(BITMAPFILEHEADER));//读入文件信息头信息 m_pBmpInfoHeader=(BITMAPINFOHEADER*) new char [sizeof(BITMAPINFOHEADER)];//给BMP信息头分配内存
    bitmapFile.Read(m_pBmpInfoHeader,sizeof(BITMAPINFOHEADER)); if(m_pBmpFileHeader->bfType!=0x4D42)//判断文件是不是位图文件
    {
    AfxMessageBox("This is not a bitmap file!!");
    bFileRead=FALSE;
    bitmapFile.Close();
    return;
    } if(m_pBmpInfoHeader->biCompression!=0)//判断图像是不是压缩的
    {
    AfxMessageBox("This system only support Un-compression!!");
    bitmapFile.Close();
    return;
    } switch(m_pBmpInfoHeader->biBitCount)//判断颜色的位数
    {
    case 1:
    nPaletteSize=2;
    break;
    case 4:
    nPaletteSize=16;
    break;
    case 8:
    nPaletteSize=256;
    break;
    case 24:
    nPaletteSize=0;//当为真彩色时没有颜色表,所以为0
    break;
    default:
    AfxMessageBox("This color is not valid!!");
    bitmapFile.Close();
    return;
    } //下面根据不同的图像位数,计算调色板的大小
    m_pBmpInfo=(BITMAPINFO *)new char [sizeof(BITMAPINFOHEADER)+nPaletteSize*sizeof(RGBQUAD)];//根据调色板大小给位图分配内存
    bitmapFile.Read(&(m_pBmpInfo->bmiColors[0]),nPaletteSize*sizeof(RGBQUAD));//调入调色板数据到位图信息
    m_pBmpInfo->bmiHeader=*m_pBmpInfoHeader;//给位图信息的位图信息头赋值 DWORD bytesPerLine=m_pBmpInfoHeader->biWidth*(m_pBmpInfoHeader->biBitCount/8);//计算每行图像所占的字节数
    if(bytesPerLine%4!=0)//当宽度为奇数时
    bytesPerLine=(bytesPerLine/4+1)*4;//对每行图像进行对齐 /*unsigned int */size=m_pBmpInfoHeader->biHeight*bytesPerLine;//计算图像数据所占大小 pDib=(BYTE*)new char[size];//给图像数据分配内存
    bitmapFile.Read(pDib,size);//读入位图数据
    bitmapFile.Close(); width=m_pBmpInfoHeader->biWidth;//得到图像数据的宽度
    height=m_pBmpInfoHeader->biHeight;//得到图像数据的高度
    bFileRead=TRUE;
    Invalidate();
    }
    void CXXXView::OnFileSave() 
    {
    // TODO: Add your command handler code here
    BITMAPFILEHEADER bmpFileHeader;
    LPBITMAPINFOHEADER lpBmpInfoHeader;
    CFileDialog dlg(FALSE,_T("BMP"),_T("*.BMP"),OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,_T("位图文件(*.BMP)|*.BMP|"));

    CString fileName;
    if(IDOK==dlg.DoModal())
    fileName.Format("%s",dlg.GetPathName());
    else
    return ;
    CFile dibFile(fileName, CFile::modeCreate|CFile::modeWrite);
    dibFile.Write(m_pBmpFileHeader,sizeof(BITMAPFILEHEADER));
    if(nPaletteSize)
    dibFile.Write(m_pBmpInfo,sizeof(BITMAPINFO)+nPaletteSize*sizeof(RGBQUAD));//灰度图
    else
    dibFile.Write(m_pBmpInfoHeader,sizeof(BITMAPINFOHEADER));//RGB图 dibFile.Write(pDib,size);
    dibFile.Close();
    }