vs2010基于MFC位图打开显示保存

//打开位图
002 void CBitMapDlg::OnBnClickedButtonopenbitmap()
003 {
004     static char szFilter[]="位图文件(*.bmp;*.dib)|*.bmp;*.dib|All Files(*.*)|*.*||";
005     CFileDialog dlg(true,"*.bmp",NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,szFilter);
006     if(dlg.DoModal()==IDOK)
007     {
008         UpdateData(true);
009         m_fileName=dlg.GetPathName();
010     }
011     openbitmap();
012     SetDlgItemText(IDC_EDIT2,"打开位图成功");
013 }
014  
015 void CBitMapDlg::openbitmap()
016 {
017     //新建CFile类对象dibFile,并用只读的模式打开位图文件
018     CFile dibFile;
019     if(!dibFile.Open(m_fileName,CFile::modeRead))
020     {
021         SetDlgItemText(IDC_EDIT2,"Can't open DIB file...");
022         return;
023     }
024  
025     //接下来要读取位图文件的文件头
026     //新建一个位图文件头变量
027     BITMAPFILEHEADER bitmapFileHeader;
028     //从位图文件中读取与位图文件头大小的字节到文件头变量中
029     UINTbitmapFileHeaderSize=dibFile.Read((void*)&bitmapFileHeader,sizeof(BITMAPFILEHEADER));
030     if(bitmapFileHeaderSize!=sizeof(BITMAPFILEHEADER))
031     {
032         SetDlgItemText(IDC_EDIT2,"读取文件头失败");
033         return;
034     }
035  
036     //判断读取的文件是否为位图文件
037     if(bitmapFileHeader.bfType==0x4d42)
038     {
039         //获取整个位图文件的长度
040         DWORD dwFileLength=dibFile.GetLength();
041         DWORD dwSize=dwFileLength-sizeof(BITMAPFILEHEADER);
042         m_hDIB=(HGLOBAL)::GlobalAlloc(GMEM_MOVEABLE,dwSize);
043  
044         //锁定分配的内存,将返回指向此内存的指针
045         BYTE* m_pdib=(BYTE*)::GlobalLock((HGLOBAL)m_hDIB);
046         //将位图信息头和像素数据一起读入到已分配的内存当中
047         DWORD dwReadSize=dibFile.Read((void*)m_pdib,dwSize);
048         BITMAPINFO *m_pBitmapInfo=(BITMAPINFO*)m_pdib;
049         BITMAPINFOHEADER *m_pBitmapInfoHeader=(BITMAPINFOHEADER*)m_pdib;
050         m_nWidth=m_pBitmapInfoHeader->biWidth;
051         m_nHeight=m_pBitmapInfoHeader->biHeight;
052         m_nBitCount=m_pBitmapInfoHeader->biBitCount;
053  
054         if(m_nBitCount<24)
055         {
056             SetDlgItemText(IDC_EDIT2,"打开的不是大于24位的真彩色图片,不能进行处理,只能显示和保存位图!");
057         }
058  
059         m_pDibData=(char*)m_pdib+m_pBitmapInfoHeader->biSize;
060         CDC* pDC=GetDC();
061         ::StretchDIBits(pDC->m_hDC,0,0,m_nWidth,m_nHeight,0,0,m_nWidth,m_nHeight,
062             m_pDibData,m_pBitmapInfo,DIB_RGB_COLORS,SRCCOPY);
063         ::GlobalUnlock((HGLOBAL)m_hDIB);
064     }
065     else
066     {
067         SetDlgItemText(IDC_EDIT2,"非位图文件");
068         return;
069     }
070 }
071 void CBitMapDlg::OnLButtonDblClk(UINT nFlags, CPoint point)
072 {
073     // TODO: 在此添加消息处理程序代码和/或调用默认值
074     if( point.x < m_nWidth &&  point.y < m_nHeight)
075     {
076         CDC* pDC=GetDC(); //得到当前设备的句柄指针
077         COLORREF color  = pDC->GetPixel(point);
078         COLORREF colorTemp;
079         if(color != 0 /*纯白*/&& color != 0xffffff /*纯黑*/ && color != RGB(240,240,240)/*灰*/)
080         {
081             for(int i=0;i<m_nWidth ;i++)
082             {
083                 for(int j=0; j<m_nHeight; j++)
084                 {
085                     colorTemp = pDC->GetPixel(i,j);
086                     if(colorTemp == color)
087                     {
088                         pDC->SetPixel(i,j,m_ctrlchoosecolor);
089                         SetDlgItemText(IDC_EDIT2,"颜色修改成功");
090                     }
091                 }
092             }
093         }
094         else SetDlgItemText(IDC_EDIT2,"选择线条/字体,不可改变背景颜色");
095          
096         this->Invalidate(0);
097     }
098     CDialogEx::OnLButtonDblClk(nFlags, point);
099 }
100  
101  
102 void CBitMapDlg::OnBnClickedsavebitmap()
103 {
104  
105     CClientDC  dc(this);
106     CDC   memDC;
107     memDC.CreateCompatibleDC(&dc);  
108     CBitmap   bm;
109     int   Width   = m_nWidth;  // rect.Width(); 
110     int   Height   = m_nHeight;  // rect.Height(); 
111     bm.CreateCompatibleBitmap(&dc,   Width,   Height);  
112     CBitmap*     pOld   =   memDC.SelectObject(&bm);  
113     memDC.BitBlt(0,   0,   Width,   Height,   &dc,   0,   0,   SRCCOPY);  
114     memDC.SelectObject(pOld);  
115     BITMAP     btm;  
116     bm.GetBitmap(&btm);  
117     DWORD     size   =   btm.bmWidthBytes   *   btm.bmHeight;  
118     LPSTR   lpData   =   (LPSTR)GlobalAlloc(GPTR,   size);  
119     BITMAPFILEHEADER       bfh;  
120     /  
121     BITMAPINFOHEADER     bih;  
122     bih.biBitCount   =   btm.bmBitsPixel;  
123     bih.biClrImportant   =   0;  
124     bih.biClrUsed   =   0;  
125     bih.biCompression   =   0;  
126     bih.biHeight   =   btm.bmHeight;  
127     bih.biPlanes   =   1;  
128     bih.biSize   =   sizeof(BITMAPINFOHEADER);  
129     bih.biSizeImage   =   size;  
130     bih.biWidth   =   btm.bmWidth;  
131     bih.biXPelsPerMeter   =   0;  
132     bih.biYPelsPerMeter   =   0;  
133     GetDIBits(dc,bm,0,bih.biHeight,lpData,(BITMAPINFO*)&bih,DIB_RGB_COLORS);  
134     bfh.bfReserved1   =   bfh.bfReserved2   =   0;  
135     bfh.bfType   =   ((WORD)('M'<<   8)|'B');  
136     bfh.bfSize   =   54   +   size;  
137     bfh.bfOffBits   =   54;  
138  
139     CFileDialog   dlg(false,_T("BMP"),_T("*.bmp"),OFN_HIDEREADONLY   |   OFN_OVERWRITEPROMPT,_T("*.bmp|*.bmp|*.*|*.*|"));  
140     if   (dlg.DoModal()!=IDOK)  
141         return;  
142  
143     CFile     bf;  
144  
145     CString   ss=dlg.GetPathName();  
146     if(bf.Open(ss,   CFile::modeCreate   |   CFile::modeWrite))  
147     {  
148         bf.Write(&bfh,sizeof(BITMAPFILEHEADER));  
149         bf.Write(&bih,sizeof(BITMAPINFOHEADER));  
150         bf.Write(lpData,   size);  
151         bf.Close();  
152     }  
153     GlobalFree(lpData);
154     SetDlgItemText(IDC_EDIT2,"保存图片成功");
155 }
156  
157 void CBitMapDlg::OnBnClickedresetcolor()
158 {
159     // TODO: 在此添加控件通知处理程序代码
160     openbitmap();
161 }

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值