- //打开位图
- void CBitMapDlg::OnBnClickedButtonopenbitmap()
- {
- static char szFilter[]="位图文件(*.bmp;*.dib)|*.bmp;*.dib|All Files(*.*)|*.*||";
- CFileDialog dlg(true,"*.bmp",NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,szFilter);
- if(dlg.DoModal()==IDOK)
- {
- UpdateData(true);
- m_fileName=dlg.GetPathName();
- }
- openbitmap();
- SetDlgItemText(IDC_EDIT2,"打开位图成功");
- }
- void CBitMapDlg::openbitmap()
- {
- //新建CFile类对象dibFile,并用只读的模式打开位图文件
- CFile dibFile;
- if(!dibFile.Open(m_fileName,CFile::modeRead))
- {
- SetDlgItemText(IDC_EDIT2,"Can't open DIB file...");
- return;
- }
- //接下来要读取位图文件的文件头
- //新建一个位图文件头变量
- BITMAPFILEHEADER bitmapFileHeader;
- //从位图文件中读取与位图文件头大小的字节到文件头变量中
- UINT bitmapFileHeaderSize=dibFile.Read((void*)&bitmapFileHeader,sizeof(BITMAPFILEHEADER));
- if(bitmapFileHeaderSize!=sizeof(BITMAPFILEHEADER))
- {
- SetDlgItemText(IDC_EDIT2,"读取文件头失败");
- return;
- }
- //判断读取的文件是否为位图文件
- if(bitmapFileHeader.bfType==0x4d42)
- {
- //获取整个位图文件的长度
- DWORD dwFileLength=dibFile.GetLength();
- DWORD dwSize=dwFileLength-sizeof(BITMAPFILEHEADER);
- m_hDIB=(HGLOBAL)::GlobalAlloc(GMEM_MOVEABLE,dwSize);
- //锁定分配的内存,将返回指向此内存的指针
- BYTE* m_pdib=(BYTE*)::GlobalLock((HGLOBAL)m_hDIB);
- //将位图信息头和像素数据一起读入到已分配的内存当中
- DWORD dwReadSize=dibFile.Read((void*)m_pdib,dwSize);
- BITMAPINFO *m_pBitmapInfo=(BITMAPINFO*)m_pdib;
- BITMAPINFOHEADER *m_pBitmapInfoHeader=(BITMAPINFOHEADER*)m_pdib;
- m_nWidth=m_pBitmapInfoHeader->biWidth;
- m_nHeight=m_pBitmapInfoHeader->biHeight;
- m_nBitCount=m_pBitmapInfoHeader->biBitCount;
- if(m_nBitCount<24)
- {
- SetDlgItemText(IDC_EDIT2,"打开的不是大于24位的真彩色图片,不能进行处理,只能显示和保存位图!");
- }
- m_pDibData=(char*)m_pdib+m_pBitmapInfoHeader->biSize;
- CDC* pDC=GetDC();
- ::StretchDIBits(pDC->m_hDC,0,0,m_nWidth,m_nHeight,0,0,m_nWidth,m_nHeight,
- m_pDibData,m_pBitmapInfo,DIB_RGB_COLORS,SRCCOPY);
- ::GlobalUnlock((HGLOBAL)m_hDIB);
- }
- else
- {
- SetDlgItemText(IDC_EDIT2,"非位图文件");
- return;
- }
- }
- void CBitMapDlg::OnLButtonDblClk(UINT nFlags, CPoint point)
- {
- // TODO: 在此添加消息处理程序代码和/或调用默认值
- if( point.x < m_nWidth && point.y < m_nHeight)
- {
- CDC* pDC=GetDC(); //得到当前设备的句柄指针
- COLORREF color = pDC->GetPixel(point);
- COLORREF colorTemp;
- if(color != 0 /*纯白*/&& color != 0xffffff /*纯黑*/ && color != RGB(240,240,240)/*灰*/)
- {
- for(int i=0;i<m_nWidth ;i++)
- {
- for(int j=0; j<m_nHeight; j++)
- {
- colorTemp = pDC->GetPixel(i,j);
- if(colorTemp == color)
- {
- pDC->SetPixel(i,j,m_ctrlchoosecolor);
- SetDlgItemText(IDC_EDIT2,"颜色修改成功");
- }
- }
- }
- }
- else SetDlgItemText(IDC_EDIT2,"选择线条/字体,不可改变背景颜色");
- this->Invalidate(0);
- }
- CDialogEx::OnLButtonDblClk(nFlags, point);
- }
- void CBitMapDlg::OnBnClickedsavebitmap()
- {
- CClientDC dc(this);
- CDC memDC;
- memDC.CreateCompatibleDC(&dc);
- CBitmap bm;
- int Width = m_nWidth; // rect.Width();
- int Height = m_nHeight; // rect.Height();
- bm.CreateCompatibleBitmap(&dc, Width, Height);
- CBitmap* pOld = memDC.SelectObject(&bm);
- memDC.BitBlt(0, 0, Width, Height, &dc, 0, 0, SRCCOPY);
- memDC.SelectObject(pOld);
- BITMAP btm;
- bm.GetBitmap(&btm);
- DWORD size = btm.bmWidthBytes * btm.bmHeight;
- LPSTR lpData = (LPSTR)GlobalAlloc(GPTR, size);
- BITMAPFILEHEADER bfh;
- /////////////////////////////////////////////
- BITMAPINFOHEADER bih;
- bih.biBitCount = btm.bmBitsPixel;
- bih.biClrImportant = 0;
- bih.biClrUsed = 0;
- bih.biCompression = 0;
- bih.biHeight = btm.bmHeight;
- bih.biPlanes = 1;
- bih.biSize = sizeof(BITMAPINFOHEADER);
- bih.biSizeImage = size;
- bih.biWidth = btm.bmWidth;
- bih.biXPelsPerMeter = 0;
- bih.biYPelsPerMeter = 0;
- GetDIBits(dc,bm,0,bih.biHeight,lpData,(BITMAPINFO*)&bih,DIB_RGB_COLORS);
- bfh.bfReserved1 = bfh.bfReserved2 = 0;
- bfh.bfType = ((WORD)('M'<< 8)|'B');
- bfh.bfSize = 54 + size;
- bfh.bfOffBits = 54;
- CFileDialog dlg(false,_T("BMP"),_T("*.bmp"),OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,_T("*.bmp|*.bmp|*.*|*.*|"));
- if (dlg.DoModal()!=IDOK)
- return;
- CFile bf;
- CString ss=dlg.GetPathName();
- if(bf.Open(ss, CFile::modeCreate | CFile::modeWrite))
- {
- bf.Write(&bfh,sizeof(BITMAPFILEHEADER));
- bf.Write(&bih,sizeof(BITMAPINFOHEADER));
- bf.Write(lpData, size);
- bf.Close();
- }
- GlobalFree(lpData);
- SetDlgItemText(IDC_EDIT2,"保存图片成功");
- }
- void CBitMapDlg::OnBnClickedresetcolor()
- {
- // TODO: 在此添加控件通知处理程序代码
- openbitmap();
- }
- //该片段来自于http://www.codesnippet.cn/detail/300820135470.html
来源: http://www.codesnippet.cn/detail/300820135470.html