MFC中怎样读取一个JPG文件或BMP位图文件
2012-10-09 17:22
531 查看
方式一: 注意开始的时候要在对话框上设置Picture控件 ,ID=IDC_PHOTO,定义HBITMAP m_hPhotoBitmap为该对话框的数据成员
void CTestDlg::OnPaint()
{
CPaintDC dc(this);
CStatic *pStaic = (CStatic*)GetDlgItem(IDC_PHOTO);//获取ID为IDC_PHOTO控件的指针
CBitmap bmp; //定义位图变量
bmp.Attach(m_hPhotoBitmap);
BITMAP bm; //定义一个位图结构
bmp.GetBitmap(&bm);
CDC dcMem;
dcMem.CreateCompatibleDC(GetDC()); //创建一个兼容的DC
CBitmap *poldBitmap=(CBitmap*)dcMem.SelectObject(bmp); //将位图选入设备环境类
CRect lRect; //定义一个区域
pStaic->GetClientRect(&lRect); //获取控件的客户区域
lRect.NormalizeRect();
pStaic->GetDC()->StretchBlt(lRect.left ,lRect.top ,lRect.Width(),lRect.Height(),
&dcMem,0 ,0,bm.bmWidth,bm.bmHeight,SRCCOPY); //显示位图
dcMem.SelectObject(&poldBitmap); //将原有的句柄?
}
然后:
void CTestDlg::OnOK()
{
CRect Rect; //定义一个区域
GetDlgItem(IDC_PHOTO)->GetWindowRect(&Rect);//获取区域
ScreenToClient(&Rect); //将屏幕坐标转换为客户坐标
CFileDialog FileDlg(TRUE, "BMP", NULL, //定义文件对话框
OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, "位图文件(*.BMP)|*.BMP||");
if(FileDlg.DoModal() != IDOK) //打开文件对话框
return ;
CString pathname = FileDlg.GetPathName();//获取选中文件的路径
CFile file; //定义一个文件变量
if(!file.Open(pathname, CFile::modeRead) )//以制度的方式打开文件
return ;
DWORD m_nFileLen = file.GetLength();//获取文件的长度
char*m_pBMPBuffer = new char[m_nFileLen + 1];//开辟符数组
if(!m_pBMPBuffer) //如果控件不够大
return ;
if(file.ReadHuge(m_pBMPBuffer,m_nFileLen) != m_nFileLen)//读取文件保存在字符数组中
return ;
LPSTR hDIB,lpBuffer = m_pBMPBuffer;
LPVOID lpDIBBits;
BITMAPFILEHEADER bmfHeader;//保存bmp文件头的信息
DWORD bmfHeaderLen;//保存文件头的长度
bmfHeaderLen = sizeof(bmfHeader);//读取文件头的长度
strncpy((LPSTR)&bmfHeader,(LPSTR)lpBuffer,bmfHeaderLen);//文件的赋值
if (bmfHeader.bfType != (*(WORD*)"BM"))//如果文件类型不对
return ;
hDIB = lpBuffer + bmfHeaderLen; //将指针移动到文件头的后面
BITMAPINFOHEADER &bmiHeader = *(LPBITMAPINFOHEADER)hDIB ;//读取bmp文件的数据
BITMAPINFO &bmInfo = *(LPBITMAPINFO)hDIB ;
lpDIBBits=(lpBuffer)+((BITMAPFILEHEADER *)lpBuffer)->bfOffBits;
CClientDC dc(this);
m_hPhotoBitmap = CreateDIBitmap(dc.m_hDC,&bmiHeader,CBM_INIT,lpDIBBits,&bmInfo,DIB_RGB_COLORS);
//显示位图到指定的Picture控件上
//在ON_PAINT()消息响应函数中实现
Invalidate(TRUE);
}
方式二:
CFileDialog fileOpenDlg(TRUE, "bmp", "*.bmp", NULL, "Bitmap Files(*.bmp)", NULL); int nRespond = fileOpenDlg.DoModal(); if(nRespond == IDOK) { CString filePath = fileOpenDlg.GetPathName(); m_pDib = new CDib(filePath); if(m_pDib->IsValid()) { SetWindowText(filePath); drawpicture(); } else { if (m_pDib) { delete m_pDib; m_pDib = NULL; } } } CClientDC dc(this);CDib* pDib = m_pDib; if(pDib) { RefreshWindow(); //获取位图的宽度和高度 m_nWidth = (int)pDib->GetWidth(); m_nHeight = (int)pDib->GetHeight(); //创建设备兼容位图 CDC memDC; memDC.CreateCompatibleDC(&dc); CBitmap* pOldBitmap = memDC.SelectObject(&m_bitmap); pDib->Draw(memDC.m_hDC, 1,1, m_nWidth, m_nHeight, 0, 0, m_nWidth, m_nHeight, DIB_RGB_COLORS, SRCCOPY); int nOldBkMode = memDC.SetBkMode(TRANSPARENT); dc.BitBlt(0, 0, 800, 600, &memDC, 0, 0, SRCCOPY); memDC.SelectObject(pOldBitmap); memDC.SetBkMode(nOldBkMode); } if(m_bitmap.GetSafeHandle()) m_bitmap.DeleteObject(); CClientDC dc(this); //创建设备兼容位图 CRect clientRect; m_img.MoveWindow(CRect(0,0,m_pDib->GetWidth()+3,m_pDib->GetHeight()+3)); m_img.GetClientRect(&clientRect); m_bitmap.CreateCompatibleBitmap(&dc,clientRect.Width(),clientRect.Height()); CDC memDC; memDC.CreateCompatibleDC(&dc); CBitmap* pOldBitmap = memDC.SelectObject(&m_bitmap); memDC.SelectObject(pOldBitmap); ReleaseDC(&dc);
相关文章推荐
- MFC中怎样将位图写入指定的Picture控件中,两种方式:1 加载已有位图 2读取位图文件;另外CreateDIBitmap的用法和StretchDIBits用法举例
- 读取BMP文件中关于位图属性的信息,将一个数值矩阵封装为一个BMP格式的文件
- MFC中怎样将位图写入指定的Picture控件中,两种方式:1 加载已有位图 2读取位图文件;另外CreateDIBitmap的用法和StretchDIBits用法举例
- [转载]VC6.0中使用Stream Object读取数据中流文件并显示Bmp,JPG等
- 怎样显示Jpg,bmp,Gif图像文件
- 怎样用JAVA打开一个已经写好的TXT文件? 是打开,不是读取啊!!!
- 怎样用matlab读取一个文件夹下的多个子文件夹中的多个图片文件
- ffmpeg 重写tutorial01程序--将一个视频文件解码输出bmp和jpg文件
- 利用COM组件IPicture读取jpg、gif、bmp图片文件数据和显示图片的两个函数
- bmp位图文件:读取、写入、24位真彩转8位灰度、灰度图的二值化
- 保存MFC的CBitmap对象中的图象到一个BMP文件中
- 从文件导出一个位图资源写成BMP位图文件
- MFC中怎样把抓取到的位图保存到指定文件中
- 数据恢复软件(一):一个恢复BMP位图文件的小程序
- matlab中怎样读取一个文件夹里面的指定类型的所有文件的名称?
- 利用COM组件IPicture读取jpg、gif、bmp图片文件数据和显示图片的两个函数
- 【文件】读取一个文件夹下所有的jpg图片
- VC/MFC读取BMP文件并显示
- 怎样在CSDN博客中使用程序结果的截图和win7自带的画图工具:可以将jpg图片转为bmp位图。win7的截图工具和绘图工具在哪?
- 飞鸽传书 CFile 来读取位图 BMP 文件