//打开位图 |
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 | 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 | } |
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 | } |
联系客服