MFC中怎样读取一个JPG文件或BMP位图文件

原创 2012年10月09日 17:22:50
方式一:
注意开始的时候要在对话框上设置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用法举例

注意着两种方式都要事先在对话框中拖picture控件,将其ID改为:IDC_PHOTO 看这篇文章之前建议先看一下下面这篇文章: VC下显示位图的几种方法     http://blo...
  • zhangyulin54321
  • zhangyulin54321
  • 2012年10月23日 14:51
  • 5610

MFC读取图片方式

1.类型:HBITMAP、CBitmap、CImage、Mat(Open cv)、HObject(Halcon) 2.注意图像单通道与三通道的问题 3.实现类// Bmp.h : 获取bmp图片头...
  • u014686875
  • u014686875
  • 2016年11月17日 14:57
  • 1353

MFC 打开文件夹读取图片

主要使用CFileDialog类实现: // void ReadSource() void ReadSource() { CFileDialog ccFileDlg(TRUE, NULL, ...
  • alex_my
  • alex_my
  • 2013年02月28日 18:01
  • 7982

【数字图像处理】一.MFC详解显示BMP格式图片

本文主要是讲述《数字图像处理》系列栏目中的文章.主要详细介绍了BMP图片格式,同时使用C++和MFC显示BMP格式,主要结合自己的《数字图像处理》课程和以前的项目叙述讲解.从四个方面进行叙述:BMP图...
  • Eastmount
  • Eastmount
  • 2014年01月14日 19:31
  • 19412

(学习笔记3)BMP位图的读取与显示

在(学习笔记2)中,我们已经详细说明如何去创建MFC。在这节中,主要解决BMP位图照片的读取和显示问题。我们新建一个工程demo1。创建步骤请看(学习笔记2)中详细说明。 创建成功后,如下图所示: ...
  • caicai_zju
  • caicai_zju
  • 2016年04月06日 10:48
  • 9731

MFC中BMP图片的读取

  • 2015年05月31日 19:27
  • 8.37MB
  • 下载

MFC读取图片文件并获得图片头和数据

需要读取图片文件,获得图片的头BITMAPINFOHEADER和数据BYTE*,看了好多例子 整理一下删减后的几种方法 1. 2. 3....
  • qq_26973095
  • qq_26973095
  • 2017年06月20日 15:58
  • 1017

读取bmp图片数据

读取bmp图片数据 1 public void getBMPImage(String source) throws Exception { 2 3 ...
  • dearm23
  • dearm23
  • 2015年11月17日 23:22
  • 283

读取BMP文件并显示出来(C++实现)

读取BMP文件的时候我们首先需要弄清楚bmp格式文件的结构 bmp的文件格式 bmp文件包含在windows.h的头文件里。编写代码的时候可以直接调用Windows.h 头文件来调用。...
  • wobuzhidao8
  • wobuzhidao8
  • 2017年03月28日 16:15
  • 4198

VC/MFC读取BMP文件并显示

自己写过的代码,留作保存,以后不会忘了 先声明几个变量 BYTE * pBMPDataBuf;//BMP数据buf BITMAPFILEHEADER BmpHeader;//BMP图像文件头 ...
  • fqzlala
  • fqzlala
  • 2013年02月19日 16:17
  • 2337
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:MFC中怎样读取一个JPG文件或BMP位图文件
举报原因:
原因补充:

(最多只允许输入30个字)