在现给分最好给出代码!
解决方案 »
- CRuntimeClass的构造函数并没有传入一个字符串,那么它是如何返回类名的?
- 导入avi资源时说cannot load file,sharing violation,是什么问题?
- 这两条语句究竟错在哪里?
- 请教用 vc 如何写虚拟打印机打印机
- DCOM客户端调用失败,请教大家。
- 200 分求周长发的处理 bmp 图象的算法程序
- 怎麼可以實現應用程序的自我拷貝功能!! 謝謝嘍...
- (100分问题!!!)在进行键盘纪录的时候怎样截获Windows的中文输入内容
- 如何动态修改网页内容?
- 新手求助!关于VC中指针中的函数无法自动显示出来,以及容器的一些问题!
- 怎样获得BMP位图的数据??(想对图像的各个像素进行操作)
- 数据库连接出错,高手求救!!
可参考一下:
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();
}