图像处理案例new.docx
《图像处理案例new.docx》由会员分享,可在线阅读,更多相关《图像处理案例new.docx(71页珍藏版)》请在冰豆网上搜索。
![图像处理案例new.docx](https://file1.bdocx.com/fileroot1/2022-11/25/d917e3c0-f0af-488f-b814-9797214f2693/d917e3c0-f0af-488f-b814-9797214f26931.gif)
图像处理案例new
Imager指南
注意:
本文档仅提供设计思路,步骤并非完整的制作步骤,代码不定能直接编译运行。
完整代码请参照源程序。
Imager的使用
简介
Imager是一个集成了屏幕抓取、图像处理和图像编辑等基本功能的软件。
Imager具有OfficeXP界面风格,采用FathSoft的ImageX控件进行图像处理,能够处理bmp、jpg、gif等多种图形文件,能够通过网络、屏幕抓取以及从扫描仪等设备中获取图像资源。
图6-1Imager主界面
获取图像资源
抓取屏幕
单击File菜单,选中Capture菜单项,在Capture子菜单中选择Screen,抓取屏幕
图6-2抓取屏幕
图6-3抓取屏幕结果
打开图像
单击File菜单,选中Open菜单项。
打开图像文件。
打开图像文件
来自扫描仪
单击File菜单,选中Aquire菜单项,打开扫描仪面板。
打开Aquire面板
来自网络的图像资源
单击File菜单,选中Import选项,开网络图像资源对话框。
图像处理
基本处理
基本的图像处理包括图像的翻转、镜像、缩放和旋转等。
在Imager界面左边的ToolBox面板中选择“图像处理”页,可以看到相应按钮。
原图
翻转
镜像
旋转45度
缩放
滤镜操作
滤镜处理可以对图像进行模糊、反色、锐化、羽化等滤镜操作。
在Imager界面左边的ToolBox面板中选择“滤镜操作”页,可以看到相应按钮。
反色
模糊
边缘
GrayScale
图像编辑
图像编辑可以在图像上进行自由画线、画矩形/椭圆等操作。
在Imager界面左边的ToolBox面板中选择“图像编辑”页,可以看到相应按钮。
自由手绘
画椭圆
二、Imager的开发
2.1开发工具与设置
2.1.1BCGPRO
BCGPRO(BCGControlBarProfessional)是一个用于应用程序界面开发的界面库,其前身为一个名为CJLIBRARY的共享界面库,后经过改进商业化。
BCGPRO提供了多种风格的界面效果和格式控件,这包括Office2000/OfficeXP/WindowXP界面风格以及各种按钮、列表框、工具条等。
BCGPRO的安装
找到BCGPRO安装程序BCGControlBarPro.exe,双击开始安装。
2>按照提示,单击”Next”或“Yes”按钮,直到出现如下提示。
单击“Finish”按钮,完成安装。
完成安装后,BCGPRO安装程序会自动查找计算机上的VC,并试图将BCGPRO的工程向导以及帮助文件集成到VC中。
单击“OK”按钮,让其完成该项工作。
3>如果集成顺利的话,会出现如下窗口,单击“Close”按钮,BCGPRO安装程序会试图调用VC编译BCGPRO的动态和静态链接库。
4>在随后启动的BCGPROBuildWizard中单击下一步。
5>在如下窗口中选择需要编译的工程类型。
一般多选择VC++6Release和VC++6Debug两个动态链接库。
如果需要使用到静态链接库或者其它Unicode类型的动态库,可以选择相应的选项。
单击“下一步”。
6>BCGPROBuildWizard开始编译所需的库文件。
编译进度会在进度条上显示。
编译完成后单击“下一步”。
7>BCGPROBuildWizard提供了编译过程中产生的信息,如果有编译错误,能在其中看到。
单击“完成”完成BCGPRO的编译工作。
安装正式完工。
创建BCGPRO工程
启动VC6,在File菜单中选择New菜单项创建一个工程。
在工程向导列表中可以单刀BCGPRO安装程序在其中添加了两个工程向导,分别为BCGPROAppWizard和BCGSkinApplicationWizard,构建程序界面使用前者,后者用来创建程序Skin的。
选择BCGPROAppWizard,输入工程名和工程路径,并单击OK进入到BCGPRO工程向导。
前面的步骤跟MFCAppWizard相同,设置也类似,只是BCGPRO中的资源文件只有English(US)一种,要换成中文的资源,还需要费一些功夫。
按照提示设置工程并单击下一步,直到出现如下窗口,开始BCGPRO的设置。
你可以选择应用程序界面的风格是类似VC6还是Office2000或者OfficeXP,以及是否支持浮动菜单条以及256色的工具条图像(VC默认支持的是16色)等。
设置后单击“Next”。
在下面的窗口中选择应用程序界面中需要用到的特殊元素。
例如VC6中典型的Workspacebar以及OutLook中的shortcutsbar等。
也可以现在不选择,等以后在工程中添加相应代码来添加界面元素。
单击“Next”按钮。
在本窗口中设置了是否支持用户自定义菜单和工具条,以及可以自定义的内容。
单击“Next”继续。
在最后一个窗口里,可以选择是否应用Skin,一般的程序都可以不选择该项。
单击“Finish”完成工程向导,BCGPRO工程向导会自动为你创建工程和代码。
BCGPRO自动在工程的StdAfx.h头文件中包含了BCGCBProInc.h,该头文件中声明了BCGPRO中所提供的类。
BCGPRO安装程序还将BCGPRO的头文件文件夹和库文件文件夹添加到VC6的头文件路径和库文件路径中。
这样编译工程的时候可以找到所需的BCGPRO文件。
要运行BCGPRO界面的程序,需要将相应的动态链接库(如果使用动态链接库)从BCGPRO安装目录下的bin子文件夹中拷贝到用户程序所在的文件夹中。
最后用户程序发布时,该动态链接库也要随之一起发布。
下面是BCGPRO附带的例子程序的界面效果。
.NET风格
OutLook风格
各种控件
2.1.2ImageX
ImageX是FathSoft推出的一个用于图像显示和处理的ActiveX控件,未注册的有使用时间限制。
双击ImageX的安装程序imgsetup.exe,启动Imager的安装向导。
按照提示进行安装设置,并单击“Next”按钮,直至安装完成。
Imager安装程序会向操作系统注册一个名称为Imager的控件,其对应的文件为Imager安装目录下的Imagex.ocx。
2.2搭建应用程序框架
2.2.1目标
这一部分工作的目的是使用BCGPRO创建一个OfficeXP风格的应用程序界面,创建所需的工具条、TOOLBOX以及建立命令消息映射(即用户操作命令与相应处理函数之间的映射)。
2.2.2搭建工程
打开VC6,使用BCGPRO工程向导创建工程,名为Imager。
单击OK开始工程向导。
在下面所示的窗口中选择MultipileDocument
在下面所示的窗口中确保选中了支持ActiveXControls项。
在下面所示的窗口中选择CimagerView的父类为CFormView,因为我们需要在视图中添加ActiveX控件,使用CFormView会比较方便。
在下面所示的窗口中进行如图所示的设置。
选择OfficeXP的界面风格使用浮动菜单条(Dockingmenubar)和切换式MDI。
在下面所示的窗口中进行如图所示的设置。
选择BCGPRO支持Outlook风格的标签、ImmediateDockingStyle和Autohidebars。
单击“Finish”按钮,接受后面的默认设置。
下图为初始的应用程序界面。
2.2.3创建工具条
一般的工具条
我们需要一个普通的工具条,用以执行图像缩放、切换等功能。
如下图所示。
工具条的按钮依次为“前一张图片”,“后一张图片”,“放大”,“缩小”。
创建工具条资源。
工具条ID为IDR_TOOLBAR1,其上面按钮的ID分别为ID_PREV_PIC,ID_NEXT_PIC,ID_ZOOM_IN,ID_ZOOM_OUT。
在头文件MainFrm.h中为主框架类CMainFrame添加一个CBCGPToolBar类的对象。
classCMainFrame:
publicCMDIFrameWnd
{
...
protected:
//controlbarembeddedmembers
...
CBCGPToolBarm_wndToolBar1;
...
};
在CMainFrame的OnCreate函数中创建工具条。
intCMainFrame:
:
OnCreate(LPCREATESTRUCTlpCreateStruct)
{
...
if(!
m_wndToolBar1.Create(this,//创建工具条
WS_CHILD|WS_VISIBLE|CBRS_LEFT|CBRS_TOOLTIPS|CBRS_FLYBY|CBRS_HIDE_INPLACE|CBRS_SIZE_DYNAMIC|
CBRS_GRIPPER|CBRS_BORDER_3D,
ID_VIEW_TOOLBAR1)||//当工具条有变化时将向通过该ID发送WM_COMMAND消息
!
m_wndToolBar1.LoadToolBar(IDR_TOOLBAR1,0,0,TRUE))//加载工具条资源
{
TRACE0("Failedtocreatebuildtoolbar\n");
returnFALSE;//failtocreate
}
m_wndToolBar1.SetWindowText("ViewerBar");//设置工具条标题
m_wndToolBar1.EnableDocking(CBRS_ALIGN_ANY);//工具条支持任意位置停靠
EnableDocking(CBRS_ALIGN_ANY);//CMainFrame支持工具条任意位置停靠
DockControlBar(&m_wndToolBar1);//停靠工具条
...
return0;
}
在IDR_POPUP_TOOLBAR菜单资源中添加ID_VIEW_TOOLBAR1菜单项,用于显示和隐藏该工具条。
在ClassWizard中添加ID_VIEW_TOOLBAR1的COMMAND消息和
UPDATE_COMMAND_UI消息的响应函数。
在CMainFrame的上述响应函数中添加如下代码用于显示和隐藏该工具条。
voidCMainFrame:
:
OnViewToolbar1()
{
ShowControlBar(&m_wndToolBar1,
!
(m_wndToolBar1.GetStyle()&WS_VISIBLE),
FALSE,TRUE);//如果Toolbar1可见则隐藏,反之则显示。
}
voidCMainFrame:
:
OnUpdateViewToolbar1(CCmdUI*pCmdUI)
{
pCmdUI->SetCheck(m_wndToolBar1.GetStyle()&WS_VISIBLE);
//如果Toolbar1可见,则在该菜单项上加上选中标记。
}
该工具条最后的效果如下图所示。
选中标记
工具条
具有特殊按钮的工具条
我们还需要一个叫做FormatBar的工具条,上面需要有下拉列表和颜色选取器。
如下图所示。
创建工具条资源。
工具条ID为IDR_FORMAT_BAR,上面按钮的ID分别为
IDC_LINE_TYPE、IDC_LINE_WEIGHT、IDC_FORE_COLOR、IDC_BACK_COLOR、IDC_FONT_NAME、IDC_FONT_WEIGHT、ID_BOLD、ID_ITALIC、ID_UNDERLINE,用于选择线形,线宽,前景色,背景色,字体、字号,粗体,斜体,下划线。
这些工具条上的按钮将被用户自定义的按钮替换掉。
其中线形,线宽,字体,字号将替换成非按钮对象,因此不需要设置它们的图像,它们仅仅起到占位的作用。
创建一个CBCGPToolBar的派生类CFormatBar。
其中头文件中代码如下:
classCFormatBar:
publicCBCGPToolBar
{
DECLARE_SERIAL(CFormatBar)
//Construction
public:
CFormatBar();
//Operations
public:
virtualvoidCFormatBar:
:
OnUpdateCmdUI(CFrameWnd*pTarget,BOOLbDisableIfNoHndler);
CBCGPColorMenuButton*CreateColorButton(UINTid);
//Attributes
public:
voidReset();
CBCGPColorMenuButton*pColorButton;
CBCGPColorMenuButton*pBackColorButton;
CSizem_szBaseUnits;
protected:
CPalettem_palColorPicker;//Paletteforcolorpicker
intm_nNumColours;
//Implementation
protected:
virtualvoidOnReset();
//Generatedmessagemapfunctions
//{{AFX_MSG(CFormatBar)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
向cpp文件中加入颜色定义
staticColourTableEntrycrColours[]=
{
{RGB(0x00,0x00,0x00),_T("Black")},
{RGB(0xA5,0x2A,0x00),_T("Brown")},
{RGB(0x00,0x40,0x40),_T("DarkOliveGreen")},
{RGB(0x00,0x55,0x00),_T("DarkGreen")},
{RGB(0x00,0x00,0x5E),_T("DarkTeal")},
{RGB(0x00,0x00,0x8B),_T("DarkBlue")},
{RGB(0x4B,0x00,0x82),_T("Indigo")},
{RGB(0x28,0x28,0x28),_T("Gray-80%")},
{RGB(0x8B,0x00,0x00),_T("DarkRed")},
{RGB(0xFF,0x68,0x20),_T("Orange")},
{RGB(0x8B,0x8B,0x00),_T("DarkYellow")},
{RGB(0x00,0x93,0x00),_T("Green")},
{RGB(0x38,0x8E,0x8E),_T("Teal")},
{RGB(0x00,0x00,0xFF),_T("Blue")},
{RGB(0x7B,0x7B,0xC0),_T("Blue-Gray")},
{RGB(0x66,0x66,0x66),_T("Gray-50%")},
{RGB(0xFF,0x00,0x00),_T("Red")},
{RGB(0xFF,0xAD,0x5B),_T("LightOrange")},
{RGB(0x32,0xCD,0x32),_T("Lime")},
{RGB(0x3C,0xB3,0x71),_T("SeaGreen")},
{RGB(51,204,204),_T("Aqua")},
{RGB(0x7D,0x9E,0xC0),_T("LightBlue")},
{RGB(0x80,0x00,0x80),_T("Violet")},
{RGB(0x7F,0x7F,0x7F),_T("Gray-40%")},
{RGB(0xFF,0xC0,0xCB),_T("Pink")},
{RGB(0xFF,0xD7,0x00),_T("Gold")},
{RGB(0xFF,0xFF,0x00),_T("Yellow")},
{RGB(0x00,0xFF,0x00),_T("BrightGreen")},
{RGB(0x00,0xFF,0xFF),_T("Turquoise")},
{RGB(0,204,255),_T("SkyBlue")},
{RGB(234,128,102),_T("Plum")},
{RGB(0xC0,0xC0,0xC0),_T("Gray-25%")},
{RGB(0xFF,0xE4,0xE1),_T("Rose")},
{RGB(255,254,153),_T("Tan")},
{RGB(0xFF,0xFF,0xE0),_T("LightYellow")},
{RGB(204,255,204),_T("LightGreen")},
{RGB(204,255,255),_T("LightTurquoise")},
{RGB(153,204,255),_T("PaleBlue")},
{RGB(204,153,255),_T("Lavender")},
{RGB(0xFF,0xFF,0xFF),_T("White")}
};
在该类中添加一个函数
CreateColorButton,用于创建一个指定ID的颜色选取按钮。
if(m_palColorPicker.GetSafeHandle()==NULL)
{
m_nNumColours=sizeof(crColours)/sizeof(ColourTableEntry);
ASSERT(m_nNumColours<=MAX_COLOURS);
if(m_nNumColours>MAX_COLOURS)
m_nNumColours=MAX_COLOURS;
//Createthepalette
struct
{
LOGPALETTELogPalette;
PALETTEENTRYPalEntry[MAX_COLOURS];
}pal;
LOGPALETTE*pLogPalette=(LOGPALETTE*)&pal;
pLogPalette->palVersion=0x300;
pLogPalette->palNumEntries=(WORD)m_nNumColours;
for(inti=0;i{
pLogPalette->palPalEntry[i].peRed=GetRValue(crColours[i].crColour);
pLogPalette->palPalEntry[i].peGreen=GetGValue(crColours[i].crColour);
pLogPalette->palPalEntry[i].peBlue=GetBValue(crColours[i].crColour);
pLogPalette->palPalEntry[i].peFlags=0;
}
m_palColorPicker.CreatePalette(pLogPalette);
}
CBCGPColorMenuButton*pColorButton=new
CBCGPColorMenuButton(id,_T("TextColor..."),&m_palColorPicker);
pColorButton->EnableAutomaticButton(_T("Automatic"),RGB(0,0,0));
pColorButton->EnableOtherButton(_T("MoreColors..."));
pColorButton->SetColumnsNumber(8);
//Initializecolornames:
for(inti=0;i{
CBCGPColorMenuButton:
:
SetColorName(crColours[i].crColour,crColours[i].szName);
}
returnpColorButton;
重载CBCGPToolBar类的OnReset函数。
在该函数内将特殊的按钮去替换工具条上普通的按钮。
每次BCGPRO创建工具条前都会调用该函数。
voidCFormatBar:
:
Reset()
{
CBCGPToolbarComboBoxButtoncomboLineStyle(IDC_LINE_TYPE,CImageHash:
:
GetImageOfCommand(IDC_LINE_TYPE,FALSE),CBS_DROPDOWNLIST);
comboLineStyle.AddItem("SOLID");
comboLineStyle.AddItem("Dash");
comboLineStyle.AddItem("DashDot");
comboLineStyle.AddItem("Dot");
comboLineStyle.AddItem("DashDotDot");
comboLineStyle.SelectItem(NULL);
ReplaceButton(IDC_LINE_TYPE,comboLineStyle);
//LineWeight
CBCGPToolbarComboBoxButtoncomboLineWeight(IDC_LINE_WEIGHT,CImageHash:
:
GetImageOfCommand(IDC_LINE_WEIGHT,FALSE),CBS_DROPDOWNLIST);
comboLineWeight.AddItem("0");
comboLineWeight.AddItem("1");
comboLineWeight.AddItem("2");
comboLineWeight.AddItem("5");
comboLineWeight.AddItem("8");
comboLineWeight.AddItem("10");
comboLineWei