static CString szFilter=_T("位图文件(*.bmp;*.dib)|*.bmp;*.dib|All Files(*.*)|*.*||");
CFileDialog dlg(true,_T("*.bmp"),NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,szFilter);
if(dlg.DoModal()==IDOK)
{
   UpdateData(true);
   m_fileName=dlg.GetPathName();
}
//新建CFile类对象dibFile,并用只读的模式打开位图文件
CFile dibFile;
if(!dibFile.Open(m_fileName,CFile::modeRead))
{
   AfxMessageBox(_T("Can't open DIB file..."));
   return;
}

//接下来要读取位图文件的文件头
//新建一个位图文件头变量
BITMAPFILEHEADER bitmapFileHeader;
//从位图文件中读取与位图文件头大小的字节到文件头变量中
UINT bitmapFileHeaderSize=dibFile.Read((void*)&bitmapFileHeader,sizeof(BITMAPFILEHEADER));
if(bitmapFileHeaderSize!=sizeof(BITMAPFILEHEADER))
{
   AfxMessageBox(_T("读取文件头失败"));
   return;
}

//判断读取的文件是否为位图文件
if(bitmapFileHeader.bfType==0x4d42)
{
   //获取整个位图文件的长度
   DWORD dwFileLength=(DWORD)dibFile.GetLength();
  
   //获取位图信息头和像素数据的大小(文件总长度-位图文件头的长度)
   DWORD dwSize=dwFileLength-sizeof(BITMAPFILEHEADER);    //为位图信息头和像素数据分配大小
   m_hDIB=(HGLOBAL)::GlobalAlloc(GMEM_MOVEABLE,dwSize);    //锁定分配的内存,将返回指向此内存的指针
   BYTE* m_pdib=(BYTE*)::GlobalLock((HGLOBAL)m_hDIB);
   //将位图信息头和像素数据一起读入到已分配的内存当中
   DWORD dwReadSize=dibFile.Read((void*)m_pdib,dwSize);    //获取位图信息头和位图信息的指针
   //位图信息头指针用来获取位图的宽度、高度和每个像素所占字节数
   //位图信息指针用来在StretchDIBits中显示位图时的参数
   BITMAPINFO *m_pBitmapInfo=(BITMAPINFO*)m_pdib;
   BITMAPINFOHEADER *m_pBitmapInfoHeader=(BITMAPINFOHEADER*)m_pdib;
   m_nWidth=m_pBitmapInfoHeader->biWidth;
   m_nHeight=m_pBitmapInfoHeader->biHeight;
   m_nBitCount=m_pBitmapInfoHeader->biBitCount;    if(m_nBitCount<24)
   {
AfxMessageBox(_T("打开的不是大于24位的真彩色图片,不能进行处理,只能显示和保存位图!"));
   }    //int m_nTotalColor=m_nBitCount<<1;
   //m_pDibData=m_pdib+m_pBitmapInfoHeader->biSize+m_nTotalColor*sizeof(RGBQUAD);
   //计算像素数据所在的位置(起始位置+位图信息头的大小)
   m_pDibData=(char*)m_pdib+m_pBitmapInfoHeader->biSize;
  
   //显示像素数据的内容
   CDC* pDC=GetDC(); //得到当前设备的句柄指针
   ::StretchDIBits(pDC->m_hDC,0,0,m_nWidth,m_nHeight,0,0,m_nWidth,m_nHeight,m_pDibData,m_pBitmapInfo,DIB_RGB_COLORS,SRCCOPY);    ::GlobalUnlock((HGLOBAL)m_hDIB);      //显示像素数据的内容 }
else
{
   AfxMessageBox(_T("非位图文件"));
   return;
}编译的时候出现error C2664: 'StretchDIBits' : cannot convert parameter 11 from 'BITMAPINFO *' to 'const BITMAPINFO *'的错误,找了半天都没找到怎么回事,这段代码就是网上找的,目的是现实BMP图像,求助各位前辈!

解决方案 »

  1.   

    强制转换一下试试吧。
    (const BITMAPINFO*)m_pBitmapInfo;
      

  2.   

    先谢谢兄弟,用了强制转换,提示错误,很诡异:cannot convert parameter 11 from 'const BITMAPINFO *' to 'const BITMAPINFO *'
      

  3.   

    我按照你的写了个简单的:
    CDC *pDC = GetDC(); BITMAPINFO *m_pBitmapInfo;
    void *m_pDibData;
    ::StretchDIBits(pDC->m_hDC,0,0,100,100,0,0,100,100,m_pDibData,m_pBitmapInfo,DIB_RGB_COLORS,SRCCOPY);编译完全正确。
      

  4.   

    谢谢老大,我知道怎么回事了,因为在这之前我自己定义了以下这些东西,所以出错了~
    //typedef struct tagBITMAPFILEHEADER
    //{
    // WORD bfType;   // 位图文件的类型,必须为BM
    // DWORD   bfSize;   // 位图文件的大小,以字节为单位
    // WORD bfReserved1;  // 位图文件保留字,必须为0
    // WORD bfReserved2;  // 位图文件保留字,必须为0
    // DWORD   bfOffBits; // 位图数据的起始位置,以相对于位图文件头的偏移量表示,以字节为单位
    //} BITMAPFILEHEADER; //typedef struct tagBITMAPINFOHEADER
    //{
    //  DWORD  biSize;   // 本结构所占用字节数
    //  LONG biWidth;  // 位图的宽度,以像素为单位
    //  LONG biHeight; // 位图的高度,以像素为单位
    //  WORD   biPlanes; // 目标设备的级别,必须为1
    //  WORD   biBitCount;// 每个像素所需的位数,必须是1(双色),4(16色),8(256色)或24(真彩色)之一
    //  DWORD  biCompression;   // 位图压缩类型,必须是 0(不压缩),1(BI_RLE8压缩类型)或2(BI_RLE4压缩类型)之一
    //  DWORD  biSizeImage; // 位图的大小,以字节为单位
    //  LONG biXPelsPerMeter; // 位图水平分辨率,每米像素数
    //  LONG biYPelsPerMeter;  // 位图垂直分辨率,每米像素数
    //  DWORD  biClrUsed;// 位图实际使用的颜色表中的颜色数
    //  DWORD  biClrImportant;// 位图显示过程中重要的颜色数
    //} BITMAPINFOHEADER; //typedef struct tagRGBQUAD 
    //{
    //  int BYTErgbBlue;// 蓝色的亮度(值范围为0-255)
    //  int BYTErgbGreen;   // 绿色的亮度(值范围为0-255)
    //  int BYTErgbRed; // 红色的亮度(值范围为0-255)
    //  int BYTErgbReserved;// 保留,必须为0
    //} RGBQUAD;  //typedef struct tagBITMAPINFO 
    //{
    //  BITMAPINFOHEADER bmiHeader;   // 位图信息头
    //  RGBQUAD  bmiColors[1];  // 颜色表
    //} BITMAPINFO;