您的位置:首页 > 编程语言 > C语言/C++

VC++ 数字图像处理第二章学习

2016-06-07 21:07 447 查看
晚上把孙兴华老师的书籍的第二章实现了一下,过程不算是很顺利,但是多次调整错误,终于实现了第一个小程序。

万事开头难嘛,过了第一步,也就好多了。

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);
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息