VC++ 数字图像处理第二章学习
2016-06-07 21:07
543 查看
晚上把孙兴华老师的书籍的第二章实现了一下,过程不算是很顺利,但是多次调整错误,终于实现了第一个小程序。
万事开头难嘛,过了第一步,也就好多了。
1)新建一个sln,然后进行VS2010的设置。程序是多文档类型的,选择左边栏里的MFC,MFC Application,输入方案名称,创建完成。
2)将Image.h Image.cpp ImagePoint.h ImagePoint.cpp Inclued.h TArray.h TArrayEx.h TMatrix TMatrixEx 这9个文件添加到工程目录下面,然后单击主菜单下面的“项目”-->“添加现有项”,选中这9个文件,点击添加。这样几个类和成员函数就成功地添加到了这个工程中。
3)右键点击solution视图下面的工程名称,选择属性, 将工程由活动(Debug)改为Release型,可以提高运行速率。选择 通用 和 多字符集合 。
此时点击F7生成解决方案,但是一下子报出来了好多错误。 读了一下VS的提示,发现在(D:\Program Files\VS2010\VC\atlmfc\include)目录的文件(atlimg.h)中已经存在有”CImage"类,与添加文件中的类名称重复。所以添加的文件因为类重名一下子爆发出来了好多错误。
4)添加图像的读取、保存和浮雕化
在CDigitalImageProcessingFrameworkDoc.h中 include"Image.h",添加公开成员变量 public: CImagenew m_image。
在CDigitalImageProcessingFrameworkView.cpp的OnDraw()函数中添加 pDoc->m_image.ShowImage(pDC,CPoint(0.0))。 语义是在00点显示图像。
引申:
OnDraw(CDC* pDC) 函数对应用程序窗口的客户区进行绘图的所有代码都必须写在这个函数中。
输出文字
pDC->TextOut(50,50,"asdadsda");
设置文本颜色
virtual COLORREF SetTextColor(COLORREF RGB(0,255,0));
获得当前文本颜色
COLORREFGetTextColor() const;
设置文本的背景颜色
virtual COLORREF SetBkColor(COLORREF crColor);
参数crColor是要使用的文本背景颜色的RGB值,函数的返回值为原来的背景颜色
获得当前背景颜色
COLORREF GetBkColor() const;
设置文本字符的间距
intSetTextCharacterExtra(int nCharExtra);
参数nCharExtra用来设置文本字符的额外间距,以像素为单位,函数的返回值为字符的原间距。
获得当前字符间距
int GetTextCharExtra() const;
设置文本的对齐方式
UINT SetTextAlign(UINT nFlags);
参数nFlags的值可以为:
TA_LEFT 左对齐
TA_CENTER 中间对齐
TA_RIGHT 右对齐
TA_TOP 顶部对齐
TA_BOTTOM 底部对齐
TA_BASELINE 以基线对齐
前3个用于水平方向
后3个用于垂直方向划线
pDC->LineTo(123,456);
画椭圆
Ellipse(int x1,int y1, int X2, int Y2 )
描述:绘制一个实心的椭圆起始点(x1,y1),结束点(x2,y2)。
x1,y1是椭圆外接矩形左上角点的坐标,(x2,y2)是椭圆外接矩阵右下角点的坐标。
例如:pDC->Ellipse(250, 421, 120, 100 );
CPen newPen(PS_DASHDOT,width,color); //创建新画笔
CPen* oldPen=pDC->SelectObject(&newPen); //载入新画笔并把旧画笔存入指针变量oldPen
CBrush newBrush(int style,COLORREF color);
CBrush* oldBrush=pDC->SelectObject(&newBrush);
CRect rect(30,30,300,300);
pDC->Rectangle(&rect);
在主菜单中添加菜单子项,非常方便,直接打汉字就行了,然后在右边的属性中改ID,最好是英文单词,便于辨识。 在菜单子项上右键点击,选择“添加事件处理程序”。
这时在CDigitalImageProcessingFrameworkDoc 类中就出现了响应函数 和 ON_COMMANGD
下面是具体代码:
CFileDialog::CFileDialog
(
BOOL bOpenFileDialog,
LPCTSTR lpszDefExt = NULL,
LPCTSTR lpszFileName = NULL,
DWORD dwFlags = OFN_HIDEREADONLY |OFN_OVERWRITEPROMPT,
LPCTSTR lpszFilter = NULL,
CWnd* pParentWnd = NULL
);
参数编辑
bOpenFileDialog
TRUE则显示打开文件对话框,FALSE则显示保存文件对话框。
lpszDefExt
指定默认的文件扩展名。
lpszFileName
指定默认的文件名。
dwFlags
指明一些特定风格。
lpszFilter
是最重要的一个参数,它指明可供选择的文件类型和相应的扩展名。
pParentWnd
为父窗口指针。
读入并显示图像
void CDigitalImageProcessingFrameworkDoc::OnOpenImageFile()
{
// TODO: 在此添加命令处理程序代码
CFileDialog file_dialog(TRUE,NULL,NULL,OFN_HIDEREADONLY,"BMP Files(*.bmp)|*.bmp|All Files(*.*)|*.*||");
file_dialog.m_ofn.lpstrTitle="Open Image File";
if(file_dialog.DoModal()!=IDOK)
return;
CString file_name=file_dialog.GetPathName();
m_image.ImportFrom(file_name);
UpdateAllViews(NULL);
}
保存图像
void CDigitalImageProcessingFrameworkDoc::OnSaveImageFile()
{
// TODO: 在此添加命令处理程序代码
CFileDialog file_dialog(FALSE,"bmp",NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"BMP Files(*.bmp)|*.bmp|All Files(*.*)|*.*||");
file_dialog.m_ofn.lpstrTitle="Save Image File";
if(file_dialog.DoModal()!=IDOK)
return;
CString fileName=file_dialog.GetPathName();
m_image.SaveImage(fileName);
UpdateAllViews(NULL);
}
图像浮雕化(只针对彩色图像)
void CDigitalImageProcessingFrameworkDoc::OnImageEmbossment()
{
// TODO: 在此添加命令处理程序代码
if(m_image.IsColorImage())
{
CTMatrix<RGB_TRIPLE>color=m_image.Get_color_image();
long image_height=color.Get_height();
long image_width=color.Get_width();
CTMatrix<RGB_TRIPLE>new_img=color;
for(int row=0;row<image_height;row++)
for(int column=0;column<image_width;column++)
{
if(row==0||column==0)
{
new_img[row][column]=RGB_TRIPLE(128,128,128);
}
else
{
new_img[row][column].m_Blue=BYTE((color[row][column].m_Blue-color[row-1][column-1].m_Blue+255)/2);
new_img[row][column].m_Green=BYTE((color[row][column].m_Green-color[row-1][column-1].m_Green+255)/2);
new_img[row][column].m_Red=BYTE((color[row][column].m_Red-color[row-1][column-1].m_Red+255)/2);
}
}
m_image.ImportFrom(new_img);
UpdateAllViews(NULL);
}
}
万事开头难嘛,过了第一步,也就好多了。
1)新建一个sln,然后进行VS2010的设置。程序是多文档类型的,选择左边栏里的MFC,MFC Application,输入方案名称,创建完成。
2)将Image.h Image.cpp ImagePoint.h ImagePoint.cpp Inclued.h TArray.h TArrayEx.h TMatrix TMatrixEx 这9个文件添加到工程目录下面,然后单击主菜单下面的“项目”-->“添加现有项”,选中这9个文件,点击添加。这样几个类和成员函数就成功地添加到了这个工程中。
3)右键点击solution视图下面的工程名称,选择属性, 将工程由活动(Debug)改为Release型,可以提高运行速率。选择 通用 和 多字符集合 。
此时点击F7生成解决方案,但是一下子报出来了好多错误。 读了一下VS的提示,发现在(D:\Program Files\VS2010\VC\atlmfc\include)目录的文件(atlimg.h)中已经存在有”CImage"类,与添加文件中的类名称重复。所以添加的文件因为类重名一下子爆发出来了好多错误。
4)添加图像的读取、保存和浮雕化
在CDigitalImageProcessingFrameworkDoc.h中 include"Image.h",添加公开成员变量 public: CImagenew m_image。
在CDigitalImageProcessingFrameworkView.cpp的OnDraw()函数中添加 pDoc->m_image.ShowImage(pDC,CPoint(0.0))。 语义是在00点显示图像。
引申:
OnDraw(CDC* pDC) 函数对应用程序窗口的客户区进行绘图的所有代码都必须写在这个函数中。
输出文字
pDC->TextOut(50,50,"asdadsda");
设置文本颜色
virtual COLORREF SetTextColor(COLORREF RGB(0,255,0));
获得当前文本颜色
COLORREFGetTextColor() const;
设置文本的背景颜色
virtual COLORREF SetBkColor(COLORREF crColor);
参数crColor是要使用的文本背景颜色的RGB值,函数的返回值为原来的背景颜色
获得当前背景颜色
COLORREF GetBkColor() const;
设置文本字符的间距
intSetTextCharacterExtra(int nCharExtra);
参数nCharExtra用来设置文本字符的额外间距,以像素为单位,函数的返回值为字符的原间距。
获得当前字符间距
int GetTextCharExtra() const;
设置文本的对齐方式
UINT SetTextAlign(UINT nFlags);
参数nFlags的值可以为:
TA_LEFT 左对齐
TA_CENTER 中间对齐
TA_RIGHT 右对齐
TA_TOP 顶部对齐
TA_BOTTOM 底部对齐
TA_BASELINE 以基线对齐
前3个用于水平方向
后3个用于垂直方向划线
pDC->LineTo(123,456);
画椭圆
Ellipse(int x1,int y1, int X2, int Y2 )
描述:绘制一个实心的椭圆起始点(x1,y1),结束点(x2,y2)。
x1,y1是椭圆外接矩形左上角点的坐标,(x2,y2)是椭圆外接矩阵右下角点的坐标。
例如:pDC->Ellipse(250, 421, 120, 100 );
CPen newPen(PS_DASHDOT,width,color); //创建新画笔
CPen* oldPen=pDC->SelectObject(&newPen); //载入新画笔并把旧画笔存入指针变量oldPen
CBrush newBrush(int style,COLORREF color);
CBrush* oldBrush=pDC->SelectObject(&newBrush);
CRect rect(30,30,300,300);
pDC->Rectangle(&rect);
在主菜单中添加菜单子项,非常方便,直接打汉字就行了,然后在右边的属性中改ID,最好是英文单词,便于辨识。 在菜单子项上右键点击,选择“添加事件处理程序”。
这时在CDigitalImageProcessingFrameworkDoc 类中就出现了响应函数 和 ON_COMMANGD
下面是具体代码:
CFileDialog::CFileDialog
(
BOOL bOpenFileDialog,
LPCTSTR lpszDefExt = NULL,
LPCTSTR lpszFileName = NULL,
DWORD dwFlags = OFN_HIDEREADONLY |OFN_OVERWRITEPROMPT,
LPCTSTR lpszFilter = NULL,
CWnd* pParentWnd = NULL
);
参数编辑
bOpenFileDialog
TRUE则显示打开文件对话框,FALSE则显示保存文件对话框。
lpszDefExt
指定默认的文件扩展名。
lpszFileName
指定默认的文件名。
dwFlags
指明一些特定风格。
lpszFilter
是最重要的一个参数,它指明可供选择的文件类型和相应的扩展名。
pParentWnd
为父窗口指针。
读入并显示图像
void CDigitalImageProcessingFrameworkDoc::OnOpenImageFile()
{
// TODO: 在此添加命令处理程序代码
CFileDialog file_dialog(TRUE,NULL,NULL,OFN_HIDEREADONLY,"BMP Files(*.bmp)|*.bmp|All Files(*.*)|*.*||");
file_dialog.m_ofn.lpstrTitle="Open Image File";
if(file_dialog.DoModal()!=IDOK)
return;
CString file_name=file_dialog.GetPathName();
m_image.ImportFrom(file_name);
UpdateAllViews(NULL);
}
保存图像
void CDigitalImageProcessingFrameworkDoc::OnSaveImageFile()
{
// TODO: 在此添加命令处理程序代码
CFileDialog file_dialog(FALSE,"bmp",NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"BMP Files(*.bmp)|*.bmp|All Files(*.*)|*.*||");
file_dialog.m_ofn.lpstrTitle="Save Image File";
if(file_dialog.DoModal()!=IDOK)
return;
CString fileName=file_dialog.GetPathName();
m_image.SaveImage(fileName);
UpdateAllViews(NULL);
}
图像浮雕化(只针对彩色图像)
void CDigitalImageProcessingFrameworkDoc::OnImageEmbossment()
{
// TODO: 在此添加命令处理程序代码
if(m_image.IsColorImage())
{
CTMatrix<RGB_TRIPLE>color=m_image.Get_color_image();
long image_height=color.Get_height();
long image_width=color.Get_width();
CTMatrix<RGB_TRIPLE>new_img=color;
for(int row=0;row<image_height;row++)
for(int column=0;column<image_width;column++)
{
if(row==0||column==0)
{
new_img[row][column]=RGB_TRIPLE(128,128,128);
}
else
{
new_img[row][column].m_Blue=BYTE((color[row][column].m_Blue-color[row-1][column-1].m_Blue+255)/2);
new_img[row][column].m_Green=BYTE((color[row][column].m_Green-color[row-1][column-1].m_Green+255)/2);
new_img[row][column].m_Red=BYTE((color[row][column].m_Red-color[row-1][column-1].m_Red+255)/2);
}
}
m_image.ImportFrom(new_img);
UpdateAllViews(NULL);
}
}
相关文章推荐
- Visual C++中MFC消息的分类
- MFC中Radio Button的用法详解
- MFC对话框中添加状态栏的方法
- MFC创建右键弹出菜单的方法
- MFC中动态创建控件以及事件响应实现方法
- C++ 关于MFC多线程编程的注意事项
- MFC程序对文件的处理方法
- MFC自定义消息的实现方法
- MFC实现在文件尾追加数据的方法
- MFC之ComboBox控件用法实例教程
- PHP GD 图像处理组件的常用函数总结
- PHP图像处理之imagecreate、imagedestroy函数介绍
- MFC绘制不规则窗体的方法
- jsvascript图像处理―(计算机视觉应用)图像金字塔
- Javascript图像处理思路及实现代码
- IE8引发 VS2005/2008 MFC向导出错的解决方案
- PHP图像处理之使用imagecolorallocate()函数设置颜色例子
- java数字图像处理基础使用imageio写图像文件示例
- MFC实现全屏功能代码实例
- 使用VS2010创建MFC ActiveX工程项目