MFC 各种照片格式写入



CImage image
CWnd* pWnd;
pWnd=GetDlgItem(IDC_IMAGE1);
CDC* pDC=pWnd->GetDC();
HDC  hDC = pDC->m_hDC;
 
CRect rect_frame;
pWnd->GetClientRect(&rect_frame);
image.Load(fileName);
 
 
::SetStretchBltMode(hDC,HALFTONE);
::SetBrushOrgEx(hDC,0,0,NULL);
 
image.Draw(hDC,rect_frame);
ReleaseDC(pDC); //释放picture控件的DC
image.Destroy();
CImage image
CWnd* pWnd;
pWnd=GetDlgItem(IDC_IMAGE1);
CDC* pDC=pWnd->GetDC();
HDC  hDC = pDC->m_hDC;
 
CRect rect_frame;
pWnd->GetClientRect(&rect_frame);
image.Load(fileName);
 
 
::SetStretchBltMode(hDC,HALFTONE);
::SetBrushOrgEx(hDC,0,0,NULL);
 
image.Draw(hDC,rect_frame);
ReleaseDC(pDC); //释放picture控件的DC
image.Destroy();




  3.点击button1按钮,在生成的函数中添加如下代码:

void CShowBmpDlg::OnBnClickedButton1()
{
  //从资源中加载图片
  CBitmap bitmap;
  //加载指定位图资源 Bmp图片ID
  bitmap.LoadBitmap(IDB_BITMAP1);  
  //获取对话框上的句柄 图片控件ID
 	CStatic *p=(CStatic *)GetDlgItem(IDC_STATIC_PIC);  
  //设置静态控件窗口风格为位图居中显示
  p->ModifyStyle(0xf,SS_BITMAP|SS_CENTERIMAGE); 
  //将图片设置到Picture控件上
  p->SetBitmap(bitmap); 
}

               4.运行结果如下图所示:
           
               5.总结        
        通过上面的截图我们可以发现:该方法是通过资源ID来获取BMP图片的,所以我称之为静态的方法.同时,可能你见到过在添加Picture控件时修改其Type为Bitmap在通过image选择ID的方法.但这里是通过代码来实现的,而且ModifyStyle函数的功能就相当于设置其属性.      

                   ~~上图很明显的反应了它显示图片时,如果图片尺寸超过控件size只能显示部分图片.方法我只叙述到这,需要你自己去尝试.曾经在单文档中显示BMP图片时,是通过重载onpaint事件,GetClientRect获取尺寸调用StretchBlt(图像可拉伸压缩)实现(参照
前文).
                   其实LoadBitmap函数已被LoadImage替代,该函数用于装载图标\光标\位图.如下代码所示        可以实现同样的效果,其中Rockies.bmp为本地文件,与程序相同文件夹.     

void CShowBmpDlg::OnBnClickedButton1()
{
  //获取对话框上图片控件的句柄
  CStatic* pWnd = (CStatic*)GetDlgItem(IDC_STATIC_PIC); 
  //设置静态控件窗口风格为位图居中显示
  pWnd->ModifyStyle(0xf,SS_BITMAP|SS_CENTERIMAGE);
  //显示图片
  pWnd->SetBitmap((HBITMAP)::LoadImage(NULL,
    _T("Rockies.bmp"),  //资源号或本地文件名
    IMAGE_BITMAP,       //装载位图 IMAGE_CURSOR光标 IMAGE_ICON图标
        0,                  //宽度 0为默认大小
        0,                  //高度 像素为单位
        LR_CREATEDIBSECTION | LR_DEFAULTSIZE | LR_LOADFROMFILE));
}

二.动态加载bmp图片        
             
动态添加的方法一样,只是添加代码如下(这结合我以前的代码完成).主要的步骤是:        
                1.先定义打开文件对话框,通过它获取bmp图片,其中dlg.DoMal()==IDOK表示按下确认按钮,实现后面操作.如果你学过C#就会发现它的OpenFileDialog控件与这个有些类似.        

                2.然后,获取读取文件的路径和后缀,确保其为bmp时执行读取图片信息,在"        2.MFC-bmp图片读取保存"中,我曾详细讲述过如何读取bmp图片,这里也是二进制读取文件,读取其文件头(BITMAPFILEHEADER)、信息头(BITMAPINFOHEADER)、获取其位图数据.        
                3.最后显示图像到Picture控件中,并通过GetClientRect函数获取矩形区域,显示图像.     

void CShowBmpDlg::OnBnClickedButton1()
{
  //打开文件 定义四种格式的文件bmp gif jpg tiff
  CString filter;
  filter="所有文件(*.bmp,*.jpg,*.gif,*tiff)|*.bmp;*.jpg;*.gif;*.tiff| BMP(*.bmp)|*.bmp| JPG(*.jpg)|*.jpg| GIF(*.gif)|*.gif| TIFF(*.tiff)|*.tiff||";
  CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY,filter,NULL);          

  //按下确定按钮 dlg.DoModal() 函数显示对话框
  if( dlg.DoModal() == IDOK )
  {
    //打开对话框获取图像信息
    CString BmpName = dlg.GetPathName();     //获取文件路径名   如D:\pic\abc.bmp
    CString EntName = dlg.GetFileExt();      //获取文件扩展名
    EntName.MakeLower();                     //将文件扩展名转换为一个小写字符

    if(EntName.Compare(_T("bmp")) == 0)
    {
      //定义变量存储图片信息
      BITMAPINFO *pBmpInfo;       //记录图像细节
      BYTE *pBmpData;             //图像数据
      BITMAPFILEHEADER bmpHeader; //文件头
      BITMAPINFOHEADER bmpInfo;   //信息头
      CFile bmpFile;              //记录打开文件

      //以只读的方式打开文件 读取bmp图片各部分 bmp文件头 信息 数据
      if(!bmpFile.Open(BmpName, CFile::modeRead|CFile::typeBinary)) 
        return;
      if (bmpFile.Read(&bmpHeader,sizeof(BITMAPFILEHEADER)) != sizeof(BITMAPFILEHEADER))
        return;
      if (bmpFile.Read(&bmpInfo,sizeof(BITMAPINFOHEADER)) != sizeof(BITMAPINFOHEADER))
        return;
      pBmpInfo = (BITMAPINFO *)new char[sizeof(BITMAPINFOHEADER)];
      //为图像数据申请空间
      memcpy(pBmpInfo,&bmpInfo,sizeof(BITMAPINFOHEADER));
      DWORD dataBytes = bmpHeader.bfSize - bmpHeader.bfOffBits;
      pBmpData = (BYTE*)new char[dataBytes];
      bmpFile.Read(pBmpData,dataBytes);
      bmpFile.Close();

      //显示图像
      CWnd *pWnd=GetDlgItem(IDC_STATIC_PIC); //获得pictrue控件窗口的句柄
      CRect rect;
      pWnd->GetClientRect(&rect); //获得pictrue控件所在的矩形区域
      CDC *pDC=pWnd->GetDC(); //获得pictrue控件的DC
      pDC->SetStretchBltMode(COLORONCOLOR);
      StretchDIBits(pDC->GetSafeHdc(),0,0,rect.Width(),rect.Height(),0,0,
        bmpInfo.biWidth,bmpInfo.biHeight,pBmpData,pBmpInfo,DIB_RGB_COLORS,SRCCOPY);
    }
  }
}

猜你喜欢

转载自blog.csdn.net/xmmdbk/article/details/80540255
MFC
今日推荐