vs2010基于MFC位图打开显示保存
来源:互联网 发布:知乎ios7 编辑:程序博客网 时间:2024/05/16 05:22
//打开位图
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
}
0 0
- vs2010基于MFC位图打开显示保存
- VS2010 MFC显示位图
- MFC打开并显示位图
- 打开并显示位图 mfc view
- MFC下位图显示
- MFC如何显示位图
- mfc 显示位图
- MFC 显示位图
- MFC显示位图
- MFC位图显示
- MFC显示位图
- MFC显示位图
- MFC 显示位图
- MFC显示位图
- MFC显示位图
- MFC如何显示位图
- MFC 通过opencv打开摄像头 拍照后显示保存
- MFC打开保存对话框
- Extjs之checkbox修改boxLabel的值
- C#二叉树
- 体验CSDN博客
- Galera/mysql 集群 备忘
- TCP协议疑难杂症全景解析
- vs2010基于MFC位图打开显示保存
- 17项目一:传地址值排序
- 项目1-体会函数参数传递.第二部分
- mysql下updete多表联合更新
- 表格中英文和数字不能换行
- CentOS 6.4下安装Nginx+MYSQL+Lua+Redis(下)
- Clone使用方法详解【转载】
- 9个offer,12家公司,35场面试,从微软到谷歌
- Android4.0之显示部分HAL