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

来源:互联网 发布:知乎ios7 编辑:程序博客网 时间:2024/05/16 05:22
//打开位图
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    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}
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}

0 0
原创粉丝点击