图像处理系统详细设计说明书Word文档下载推荐.docx
《图像处理系统详细设计说明书Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《图像处理系统详细设计说明书Word文档下载推荐.docx(18页珍藏版)》请在冰豆网上搜索。
b.本项目的任务提出者:
西安软件服务外包学院
开发者:
YOUNGREGINGROUP团队
1.3定义
本系统属于开发小型的图像处理软件,主要用于实现图像的显示与批量转换操作。
实现各种图像格式的显示。
支持图像的单一转换与批量转换。
实现位图的各种常规操作。
1.4参考资料
《C++程序设计》,谭浩强,清华大学出版社;
《VisualC++项目开发案例全程实录》,梁水,李伟明著,清华大学出版社。
图像锐化处理
图像反色处理
图像旋转
图像处理模块
2程序系统的结构
这是“图像管理系统”的整体系统结构图。
3系统整体及模块显示设计说明
3.1主窗口设计
在这个系统里,主要实现用户登录进入系统后可以查询和添加相关信息。
工作区菜单代码:
m_wndToolBar.GetToolBarCtrl().SetImageList(&
m_ImageList);
m_wndToolBar.SetButtonText(0,"
锐化处理"
);
m_wndToolBar.SetButtonText(1,"
反色处理"
m_wndToolBar.SetButtonText(2,"
图像旋转"
m_wndToolBar.SetButtonText(3,"
图像平移"
m_wndToolBar.SetButtonText(4,"
图像缩放"
m_wndToolBar.SetButtonText(5,"
水印效果"
m_wndToolBar.SetButtonText(6,"
位图转换JPEG"
m_wndToolBar.SetButtonText(7,"
JPEG转换位图"
m_wndToolBar.SetButtonText(8,"
水印批量处理"
m_wndToolBar.SetButtonText(9,"
PSD文件浏览"
m_wndToolBar.SetButtonText(10,"
PSD批量转换"
m_wndToolBar.SetButtonText(11,"
照片版式处理"
设置状态栏,关联图标资源:
UINTnID;
//控制状态栏里面的分栏
m_wndStatusBar.SetPaneInfo(0,nID,SBPS_STRETCH|SBPS_NOBORDERS,100);
//返回值存nID中
m_wndStatusBar.SetPaneText(0,"
就绪"
m_wndStatusBar.SetPaneInfo(1,nID,SBPS_NORMAL,100);
m_wndStatusBar.SetPaneText(1,"
大写"
m_wndStatusBar.SetPaneInfo(2,nID,SBPS_POPOUT,100);
m_wndStatusBar.SetPaneText(2,"
数字"
//加载图像资源
m_ImageList.Create(32,32,ILC_COLOR32|ILC_MASK,1,1);
m_ImageList.Add(:
:
AfxGetApp()->
LoadIcon(IDI_ICON3));
LoadIcon(IDI_ICON1));
LoadIcon(IDI_ICON2));
LoadIcon(IDI_ICON4));
LoadIcon(IDI_ICON5));
LoadIcon(IDI_ICON6));
LoadIcon(IDI_ICON7));
LoadIcon(IDI_ICON8));
LoadIcon(IDI_ICON9));
LoadIcon(IDI_ICON10));
LoadIcon(IDI_ICON11));
LoadIcon(IDI_ICON12));
3.2图像旋转模块功能设计
1.添加一个对话框类,类名为CImageRota。
窗口如下:
2.向对话框中添加按钮、文本框、单选按钮、滑块、图片控件。
3.设置主要控件属性,如下表所示:
4.处理…事件:
voidCImageRota:
OnBtLoad()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
CFileDialogflDlg(TRUE,"
"
"
OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"
位图文件|*.bmp||"
this);
if(flDlg.DoModal()==IDOK)
{
CStringcsFileName=flDlg.GetPathName();
m_SrcFile=flDlg.GetPathName();
m_BmpName.SetWindowText(csFileName);
if(m_hBmp!
=NULL)
{
DeleteObject(m_hBmp);
m_hBmp=NULL;
}
m_hBmp=(HBITMAP)LoadImage(NULL,csFileName,IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
if(m_hBmp)
m_Image.SetBitmap(m_hBmp);
m_bLoaded=TRUE;
CFilefile;
file.Open(csFileName,CFile:
modeRead);
file.Read(&
m_bmFileHeader,sizeof(BITMAPFILEHEADER));
m_bmInfoHeader,sizeof(BITMAPINFOHEADER));
intszPalette=0;
if(m_bmInfoHeader.biBitCount!
=24)
file.Close();
MessageBox("
请选择真彩色位图!
提示"
return;
if(m_bmInfoHeader.biSizeImage==0)
intexternWidth;
//计算源位图每行使用的字节数
externWidth=m_bmInfoHeader.biWidth*3;
if(externWidth%4!
=0)
externWidth=4-externWidth%4;
else
externWidth=0;
m_bmInfoHeader.biSizeImage=m_bmInfoHeader.biHeight*(m_bmInfoHeader.biWidth*3+externWidth);
intnBmpData=m_bmInfoHeader.biSizeImage;
if(m_pBmpData!
delete[]m_pBmpData;
m_pBmpData=NULL;
m_pBmpData=newBYTE[nBmpData];
file.ReadHuge(m_pBmpData,nBmpData);
file.Close();
intsizeofbuffer=m_bmInfoHeader.biWidth*m_bmInfoHeader.biHeight*4;
intexternWidth;
externWidth=m_bmInfoHeader.biWidth*3;
if(externWidth%4!
externWidth=4-externWidth%4;
else
externWidth=0;
intk=0;
BYTE*m_pImageTempBuffer=newBYTE[sizeofbuffer];
for(intn=m_bmInfoHeader.biHeight-1;
n>
=0;
n--)
for(UINTm=0;
m<
m_bmInfoHeader.biWidth*3;
m+=3)
{
m_pImageTempBuffer[k]=m_pBmpData[n*(m_bmInfoHeader.biWidth*3+externWidth)+m];
//blue
m_pImageTempBuffer[k+1]=m_pBmpData[n*(m_bmInfoHeader.biWidth*3+externWidth)+m+1];
//green
m_pImageTempBuffer[k+2]=m_pBmpData[n*(m_bmInfoHeader.biWidth*3+externWidth)+m+2];
//red
m_pImageTempBuffer[k+3]=255;
k+=4;
}
delete[]m_pBmpData;
m_pBmpData=newBYTE[sizeofbuffer];
memcpy(m_pBmpData,m_pImageTempBuffer,sizeofbuffer);
delete[]m_pImageTempBuffer;
//设置滚动范围
CRectbmpRC,wndRC;
m_ImagePanel.GetClientRect(wndRC);
//获取面板的客户区域
m_Image.GetClientRect(bmpRC);
//获取图片空间的客户区域
m_ImagePanel.OnHScroll(SB_LEFT,1,NULL);
m_ImagePanel.OnVScroll(SB_LEFT,1,NULL);
m_ImagePanel.SetScrollRange(SB_VERT,0,bmpRC.Height()-wndRC.Height());
m_ImagePanel.SetScrollRange(SB_HORZ,0,bmpRC.Width()-wndRC.Width());
}
}
5.向对话框中添加RotateBmp方法,按指定的角度旋转。
6.向对话框中添加RotationImage方法,并调用RotateBmp方法处理图像。
7.处理旋转按钮事件
OnBtRotate()
if(m_bLoaded)
//确定旋转方式
CButton*pButton=(CButton*)GetDlgItem(IDC_FIXDEGREE);
intnState=0;
intnDegree=0;
if(pButton!
nState=pButton->
GetCheck();
if(nState)//预定角度
for(intnID=IDC_ROTATE45;
nID<
=IDC_ROTATE270;
nID++)
pButton=(CButton*)GetDlgItem(nID);
if(pButton!
{
nState=pButton->
if(nState)
{
CStringcsText;
pButton->
GetWindowText(csText);
intnPos=csText.Find("
°
nDegree=atoi(csText.Left(nPos));
break;
}
}
}
else//固定角度
UpdateData(FALSE);
nDegree=m_nDegree;
//确定旋转角度
RotationImage(&
m_bmInfoHeader,nDegree);
BYTEbyByteAlign;
//位图行字节对齐
UINToutHeight=m_bmInfoHeader.biHeight;
UINToutWidth=m_bmInfoHeader.biWidth;
BYTE*pBmpData=newBYTE[m_bmInfoHeader.biSizeImage];
memset(pBmpData,0,m_bmInfoHeader.biSizeImage);
BYTE*pListData=m_pBmpData+((DWORD)outHeight-1)*outWidth*4;
if(outWidth%4!
=0)
byByteAlign=4-((outWidth*3L)%4);
byByteAlign=0;
BYTEbyZeroData=0;
BYTE*pTmpData=pBmpData;
for(inty=0;
y<
outHeight;
y++)
for(intx=0;
x<
outWidth;
x++)
memcpy(pTmpData,pListData,3);
pTmpData+=3;
pListData+=4;
for(inti=0;
i<
byByteAlign;
i++)
memcpy(pTmpData,&
byZeroData,1);
pTmpData=pTmpData+1;
pListData-=2L*outWidth*4;
CDC*pDC=m_Image.GetDC();
BITMAPINFObInfo;
bInfo.bmiHeader=m_bmInfoHeader;
HBITMAPhBmp=m_Image.SetBitmap(CreateDIBitmap(pDC->
m_hDC,&
m_bmInfoHeader,CBM_INIT,pBmpData,&
bInfo,DIB_RGB_COLORS));
if(hBmp!
:
DeleteObject(hBmp);
delete[]pBmpData;
8.处理保存按钮事件
3.3图像缩放模块设计
1.新建一个对话框类,类名为CStretchImage,界面如下:
2.向对话框中添加按钮、静态文本、群组框、滑块、复选框、图片等控件。
3.设置控件属性如下:
4.处理…、缩放、保存按钮事件。
3.4图片水印效果模块设计
1.实现水印效果主要代码为:
2.创建一个对话框类,类名为CImageWater。
3.向对话框中添加按钮、静态文本、群组框、滑块、复选框、图片等控件。
界面如下:
4.设置控件属性如下:
5.处理…、缩放、保存按钮事件。
3.5照片版式处理模块设计
1.创建一个对话框类,类名为CPhotoHandle。
4.处理…、缩放、保存按钮事件。
3.5PSD文件浏览模块设计
1.创建一个对话框类,类名为CPsdBrowse。
4位图数据的存储形式
在进行图像处理时,一个首要的问题是实现对位图数据的直接操作。
位图主要由四部分组成,分别为位图文件头、位图信息头、调色板和实际的位图数据如下:
,
其中,位图文件头对应的结构为BITMAPFILEHEADER,共占用14个字节,定义如下:
位图信息头对应的结构为BITMAPINFOHEADER,共占用40个字节,定义如下:
5限制条件
1.位图数据每行的字节数必须是4的整数倍。
2.位图数据是从下向上存储的。
3.对于真彩图来说,每一行数据是按照BRG颜色顺序排列的。
6测试计划
进入主界面
预期结果
点击图片旋转
进行操作旋转效果
点击图片缩放
进行操作缩放效果
点击水印效果
进行操作水印效果
点击照片版式
进行操作查看效果
点击退出
退出程序