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图像,求助各位前辈!
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图像,求助各位前辈!
(const BITMAPINFO*)m_pBitmapInfo;
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);编译完全正确。
//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;