首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

利用vc实现raw到bmp图像的转换有关问题,编译通过,执行的时候异常

2012-05-28 
利用vc实现raw到bmp图像的转换问题,编译通过,执行的时候错误编译没问题,执行的时候从菜单可以打开一个对话

利用vc实现raw到bmp图像的转换问题,编译通过,执行的时候错误
编译没问题,执行的时候从菜单可以打开一个对话框,浏览文件路径,输入raw图像大小之后,点确定,出现执行错误对话框。
File:filecore.cpp
Line 238
For infomation on how your program can cause an assertion failure,see the Visual C++ 
documentation on asserts.

主要函数。
void CRawToBmp::OnButtonRaw() 
{
// TODO: Add your control notification handler code here
static char BASED_CODE file[] = "RAW Files (*.RAW)|*.raw|所有文件(*.*)|*.*||"; //文件类型说明字符串
CFileDialog SelectFile (TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,file,NULL); //文件对话框初始化
SelectFile.DoModal(); //弹出对话框
CString FileName; //得到所选文件路径
FileName=SelectFile.GetPathName();
m_sRawIn=FileName;//将得到的文件名赋值给对话框成员变量m_RawIn
UpdateData(FALSE);//刷新数据

}

void CRawToBmp::OnButtonBmp() 
{
// TODO: Add your control notification handler code here
static char BASED_CODE file[] = "BMP Files (*.BMP)|*.BMP|所有文件(*.*)|*.*||"; //文件类型说明字符串
CFileDialog SelectFile (FALSE,"BMP",NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,file,NULL); //文件对话框初始化
SelectFile.DoModal(); //弹出对话框
CString FileName; //得到所选文件路径
FileName=SelectFile.GetPathName();
m_sBmpOut=FileName;//将得到的文件名赋值给对话框成员变量m_BmpOut
UpdateData(FALSE);//刷新数据

}

void CRawToBmp::OnOK() 
{
// TODO: Add extra validation here
UpdateData(TRUE);
DECLARE_HANDLE(HDIB);
HDIB hDIB; //句柄变量,存放bmp位图?
LPSTR pDIB; //指针变量,存放位图数据?
//打开文件
CFile fileraw,filebmp; //读写文件
fileraw.Open(m_sRawIn,CFile::modeRead|CFile::shareDenyWrite,NULL); //可读,拒绝写的方式打开
DWORD filesize = fileraw.GetLength();//得到文件大小
hDIB=(HDIB)::GlobalAlloc(GMEM_MOVEABLE|GMEM_ZEROINIT,filesize);//根据读取的图像大小分配空间
if(hDIB==0)
{
return;
}
pDIB=(LPSTR)::GlobalLock((HGLOBAL)hDIB); //若分配成功,得到句柄内存的起始地址
if(m_iGray==0)
fileraw.ReadHuge(pDIB,filesize); //将raw文件读到pDIB所指文件块
/*else
{
/*if(m_iBSQ==0)
{
AfxMessageBox("weishixian",MB_OK,0);
return;
}
if(m_iBSQ==1)
{
AfxMessageBox("0",MB_OK,0);
return;
}
if(m_iBSQ==2)
{
AfxMessageBox("0",MB_OK,0);
return;
}
*/
//}
//不允许其他程序同时打开bmp文件
filebmp.Open(m_sBmpOut,CFile::modeCreate|CFile::modeWrite|CFile::shareExclusive,NULL); //?参数

//写文件:文件头,位图信息头,调色板,位图数据 分四部分赋值并写入
BITMAPFILEHEADER bmfHdr; //位图文件头
BITMAPINFOHEADER bmpHdr; //位图信息头
RGBQUAD rgb[256]; //调色板

//文件头初始化
bmfHdr.bfType='MB';
bmfHdr.bfReserved1=0;
bmfHdr.bfReserved2=0;
//信息头初始化
bmpHdr.biSize=40;
bmpHdr.biWidth=m_iWidth;
bmpHdr.biHeight=m_iHeight;
bmpHdr.biPlanes=1;
bmpHdr.biCompression=BI_RGB;
bmpHdr.biXPelsPerMeter=0;
bmpHdr.biYPelsPerMeter=0;
bmpHdr.biClrUsed=0;
bmpHdr.biClrImportant=0;
if(m_iGray==0)
{
bmpHdr.biBitCount=8;
bmfHdr.bfOffBits=1078; //14+40+256*4
bmpHdr.biSizeImage=(((m_iWidth*8)+31)/32*4)*m_iHeight;//??
bmfHdr.bfSize=bmfHdr.bfOffBits+bmpHdr.biSizeImage; //????

//调色板初始化
for(int i=0;i<256;i++)
{
rgb[i].rgbBlue=i;
rgb[i].rgbGreen=i;
rgb[i].rgbRed=i;
rgb[i].rgbReserved=0;

}
}
/*else
{
bmpHdr.biBitCount=24;
bmfHdr.bfOffBits=54; //14+40
bmpHdr.biSizeImage=(((m_iWidth*24)+31)/32*4)*m_iHeight;//??
bmfHdr.bfSize=bmfHdr.bfOffBits+bmpHdr.biSizeImage;

}*/
  //写入
  filebmp.Write(&bmfHdr,sizeof(bmfHdr)); //写文件头
  filebmp.Write(&bmfHdr,sizeof(bmpHdr)); //写信息头
  if(m_iGray==0)
  filebmp.Write(rgb,sizeof(RGBQUAD)*256);
int h=m_iHeight;
int w=m_iWidth;
int iWidthBytes=bmpHdr.biSizeImage/m_iHeight;

//写数据部分
int zero=0;
for(int i=0;i<h;i++)


{
filebmp.Write(pDIB+w*(h-i-1),w); //?w
if(w!=iWidthBytes)
 
for(int j=0;j<iWidthBytes-w;j++)
filebmp.Write(&zero,1);
}
//释放句柄
::GlobalUnlock((HGLOBAL)hDIB);
::GlobalFree((HGLOBAL)hDIB);
//关闭文件
fileraw.Close();
filebmp.Close();

CDialog::OnOK();
}


[解决办法]
因为头文件的数据跟数据块对应不起来。

bmpHdr.biBitCount=24;这是24位

你上面是有调色板,也就是说8位的。



热点排行