您的位置:首页 > 其它

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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐