打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
vs2010基于MFC位图打开显示保存
//打开位图
002void 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  
015void 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    UINT bitmapFileHeaderSize=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}
071void 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  
102void 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  
157void CBitMapDlg::OnBnClickedresetcolor()
158{
159    // TODO: 在此添加控件通知处理程序代码
160    openbitmap();
161}
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
相同大小bmp文件合并拼接
C++截取整个屏幕,并生成图片(基于MFC)
C++写BMP位图,主流USB视频摄像头的媒体格式为RGB24和I420,如何把这些数据变成BMP位图存下来呢
vc++实现avi文件的操作
MFC读取jpeg
VC下载文件 显示进度条
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服