1、案卷号 日期 图像处理系统 详细设计说明书 作 者: 完成日期: 2016.8。24 签收人: 签收日期: 修改情况记录: 版本号 修改批准人 修改人 修改日期 签收人 1。0 杨开 2016。8. 23 1.1 杨开 2016。 8. 24 目录 1 弓I言 1。1编写目的1 1。2背景1 1. 3定义2 1. 4参考资料2 2程序系统的结构错误!未定义书签。 3系统登陆设计说明 3。1主窗设计3 3.2图像旋转模块功能设土4 3。3图像缩放模块设计.错.误!未定.义书.签 3. 4图片水印效果模
2、块设计.14 3。5照片版式处理模块设土14 3. 6流程逻辑错误!未定义书签。 4位图数据的存储形式 5限制条件 6测试计划 1引言 1.1编写目的 本详细设计说明书主要目的是对图像管理系统的功能设计进行详尽的说明。 本说明书主要写了图像管理系统功能模块的详细设计,为后来的开发提供依据与参考。 详细设计说明书面向人员有:程序设计人员、数据库设计人员,质量检测人员。 1。2背景 a. 项目名称:图像管理系统 1 / 16 详细设计说明书 b.本项目的任务提出者:西安软件服务外包学院 开发者:YOUNG REGIN GROUP 团队 1。3定义
3、本系统属于开发小型的图像处理软件,主要用于实现图像的显示 与批量转换操作。 实现各种图像格式的显示。 支持图像的单一转换与批量转换。 实现位图的各种常规操作。 1。4参考资料 《C++程序设计》,谭浩强,清华大学出版社; 《Visual C++项目开发案例全程实录》,梁水,李伟明著,清华大学出版社。 2程序系统的结构 图像处理模块 主窗体—►退出系统 打开位图 批量转换与处理 PSD文件管理 照片处理 位 图 图 这® “图 像 〔管位 t 系J统 ” 卧 整 体系 构 图水 P P 水 图
4、像 像 像 像 图 P I 图 图 印 S S 印 转 锐 反 旋 浮 转 E F 转 转 效 D D 效 换 化 色 转 雕 换 G 转 换 换 果 文 文 果 成 处 处 效 成 转 换 成 为 批 件 件 批 G 理 理 果 J 换 成 G P 量
5、浏 批 量 I P 成 位 I N 2 / 1处 览 量 处 F E 位 图 F G =1 理 转 理 — — — — G 图 — — 换 详细设计说明书 3系统整体及模块显示设计说明 3。1主窗设计 在这个系统里,主要实现用户登录进入系统后可以查询和添加相关信息. 工作区菜单代码: m_wndToolBar。 GetToolBa
6、rCtrl ().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。SetButtonT
7、ext( 6, ”位图转换 JPEG"); m_wndToolBar.SetButtonText(7, "JPEG 转换位图”); m_wndToolBar。SetButtonText( 8, ”水印批量处理"); m_wndToolBar.SetButtonText( 9,叩SD 文件浏览"); m_wndToolBar。SetButtonText(10,叩SD 批量转换"); m_wndToolBar。SetButtonText(11,” 照片版式处理"); 设置状态栏,关联图标资源: UINT nID; 〃控制状态栏里面的分栏 m_wndStatusBar。SetPane
8、Info ( 0,nID,SBPS_STRETCH|SBPS_NOBORDERS,1); 〃返回值存nID中 m_wndStatusBar.SetPaneText ( 0, ”就绪"); m_wndStatusBar.SetPaneInfo(1,nID,SBPS_NORMAL,1); m_wndStatusBar。SetPaneText(1,"大写"); m_wndStatusBar。 SetPaneInfo(2, nID,SBPS_POPOUT,1); m_wndStatusBar。SetPaneText (2,"数字"); //加载图像资源 3 / 16 详细设计说明书
9、 m_ImageList.Create(32, 32, ILC_COLOR32 | ILC_MASK, 1, 1); m_ImageList.Add (:: AfxGetApp()-〉LoadIcon(IDI_ICON3)); m_ImageList。Add(: : AfxGetApp()->LoadIcon(IDI_ICON1)); m_ImageList.Add(:: AfxGetApp()->LoadIcon(IDI_ICON2)); m_ImageList.Add (: : AfxGetApp() —>LoadIcon(IDI_ICON4)); m_ImageList.Add
10、 (:: AfxGetApp()—>LoadIcon(IDI_ICON5)); m_ImageList。Add(: : AfxGetApp()—>LoadIcon( IDI_ICON6)); m_ImageList.Add (:: AfxGetApp()—>LoadIcon( IDI_ICON7)); m_ImageList。Add (: :AfxGetApp()-〉LoadIcon(IDI_ICON8)); m_ImageList.Add(:: AfxGetApp() —〉LoadIcon( IDI_ICON9)); m_ImageList。Add (::AfxGetApp()->
11、LoadIcon(IDI_ICON10)); m_ImageList.Add (: : AfxGetApp ()—〉LoadIcon(IDI_ICON11)); m_ImageList.Add (: : AfxGetApp ()-〉LoadIcon(IDI_ICON12)); 3.2图像旋转模块功能设计 1。添加一个对话框类,类名为CImageRota。窗如下: 2。向对话框中添加按钮、文本框、单选按钮、滑块、图片控件。 3. 设置主要控件属性,如下表所示: 4. 处理…事件: void CImageRota: OnBtLoad() { // TODO: Add your
12、control notification handler code here
CFileDialog flDlg(TRUE,"" , ” ",OFN_HIDEREADONLY |
OFN_OVERWRITEPROMPT ,”位图文件|*.bmp||”,this);
if (flDlg.DoModal()==IDOK)
(
4 / 16
详细设计说明书
CString csFileName = flDlg.GetPathN 13、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;
}
CFile file;
file Open(csFileName CFile : modeRead);
file.Read(m_bmFileHeader,s 14、izeofBITMAPFILEHEADER));
file 。 Read(&m_bmInfoHeader , sizeof(BITMAPINFOHEADER)) ;
int szPalette = 0;
if (m—bmInfoHeadei biBitCount != 24)
5 / 16
详细设计说明书
(
file.Close ()
MessageBox(”请选择真彩色位图!”,提示”);
return;
}
if (m_bmInfoHeader.biSizeImage == 0)
{
int externWidth;
/计算源位图每行使用的字节数
exter 15、nWidth = m_bmInfoHeader.biWidth ;* 3
if(externWidth % 4 != 0
externWidth = — externWidth% 4;
else
externWidth = 0;
m_bmInfoHeader.biSizeImage = m_bmInfoHeadeibiHeight*
(m_bmInfoHeader。 biWidth* 3 +externWidth
}
int nBmpData = m_bmInfoHeader.biSizeImage;
if (m_pBmpData != NULL )
{
delete [ 16、 ]m_pBmpData;
m_pBmpData = NULL;
6 / 16
详细设计说明书
}
m_pBmpData = new BYTE [ nBmpData];
file.ReadHug(m_pBmpData , nBmpData );
file Close ();
int sizeofbuffer = m_bmInfoHeader.biWidth * m_bmInfoHeaderbiHeight * 4;
int externWidth;
externWidth = m_bmInfoHeader.biWidth 3;
if(externWidtho 4 ! = 17、0)
externWidth = 4 - externWidth4;
else
externWidth = 0;
int k =; 0
BYTE* m_pImageTempBuffer = new BYTE[sizeofbuffer;
for ( int n = m_bmInfoHeaderbiHeight - 1 n〉= 0; —-)
{
for (UINT m = 0; m < m_bmInfoHeader.biWidth* 3; m
+= 3)
(
m_pImageTempBuffer [ k ]= m_pBmpData
[n*(m_bmInfoHeader。bi 18、Width* 3+externWidt) +m ]; //blue
m_pImageTempBuffer[k+1]=
7 / 16
详细设计说明书
m_pBmpData[n*(m_bmInfoHeader。
biWidth*3+externWidth)+m+1] ;//green
m_pImageTempBuffer [ k+2 ] = m_pBmpData [ n *(m-bmInfoHeader.biWidtlh 3+externWidth)+m+2]; //red
m_pImageTempBuffer [ k+3 ] = 255;
k += 4;
}
}
delet 19、e []m_pBmpData;
m_pBmpData = new BYTE[sizeofbuffer];
memcpy(m_pBmpData, m_pImageTempBuffer, sizeofbuffer);
delete [] m_pImageTempBuffer ;
/设置滚动范围
CRect bmpRC,wndRC ;
m_ImagePanel.GetClientRect(wndRC)/获取面板的
客户区域
m_Image。GetClientRect bmpRC );/获取图片空间
的客户区域
m_ImagePanel.OnHScroll(SB_LEFT ,1, 20、NULL);
m_ImagePanel.OnVScroll(SB_LEFT, 1, NULL );
m_ImagePanel.SetScrollRange(SB_VERT,0,bmpRC。Height 0—wndRC.Height());
8 / 16
详细设计说明书
m_ImagePanel.SetScrollRange(SB_HORZ , 0,bmpRC 。
Width()—wndRC。Width())
}
}
5. 向对话框中添加RotateBmp方法,按指定的角度旋转。
6. 向对话框中添加Rotationimage方法,并调用RotateBmp方法处理图像。
7 21、 处理旋转按钮事件
void CImageRota :OnBtRotate()
{
// TODO: Add your control notification handler code here
if (m—bLoaded)
(
/确定旋转方式
CButton *pButton =(CButton
*)GetDlgItem(IDC—FIXDEGREE );
int nState = 0
int nDegree = 0;
if (pButton = NULL )
{
nState = pButt—>GetCheck ();
9 / 16
详细设计说明书
if 22、nState)/预定角度
(
for (int nID = IDC_ROTATE45; nID <= IDC_ROTATE27QnID++ )
(
pButton = (CButton)GetDlgItem(nID)
if (pButton ! = NULL)
(
nState = pButt—n〉GetCheck();
if (nState)
{
CString csText;
pButton〉GetWindowText ( csText);
int nPos = csText.Find");
nDegree = atoi(csText. (eftos));
b 23、reak
}
}
}
}
else/固定角度
{
1Q / 16
详细设计说明书
UpdateData(FALSE );
nDegree = m_nDegree;
}
/确定旋转角度
RotationImage( &m_bmInfoHeader,nDegree);
BYTE byByteAlign ;/位图行字节对齐
UINT outHeight = m_bmInfoHeader.biHeight;
UINT outWidth = m_bmInfoHeader biWidth;
BYTE *pBmpData= new BYTE
[m_bmInfoHeader 24、biSizeImage];
memset(pBmpData,O,m_bmInfoHeader.biSizeImag)s;
BYTE*pListData =m_pBmpData+
((DWORD)outHeight —1) *outWidth*4;
if (outWidth %4 != 0)
byByteAlign = 4-(6utWidth*3L) % 4);
else
byByteAlign = 0;
BYTE byZeroData = 0;
BYTE* pTmpData = pBmpData;
for (int y=0 ;y 25、int x=0;XoutWidth;x++)
11 / 16
详细设计说明书
memcpy (pTmpData,pListData 3);
pTmpData += 3;
pListData +=;4
}
for (int i=0i〈byByteAlign i++)
(
memcpy(pTmpData, &byZeroData, 1);
pTmpData =pTmpData + 1;
}
pListData -= 2LoutWidth*4;
}
CDC *pDC = m_Image.GetDC();
BITMAPINFO bInfo ;
bInfo.bmiHead 26、er = m_bmInfoHeader;
HBITMAP hBmp = m_Image 。 SetBitmap ( CreateDIBitmap
(pDC->m_hDC,&m_bmInfoHeader,
CBM_INIT,pBmpData,&bInfo,DIB_RGB_COLORS ));
if (hBmp != NULL)
(
::DeleteObje(thBmp );
12 / 16
详细设计说明书
delete [] pBmpData;
/设置滚动范围
CRect bmpRC,wndRC ;
m_ImagePanel.GetClientRectwndRC );
27、m_Image 。 GetClientRectbmpRC);
m_ImagePanel.OnHScroll(SB_LEFT, 1 NULL );
m_ImagePanel。OnVScroll(SB_LEFT, 1, NULL);
m_ImagePanel.SetScrollRan(eSB_VERT,0 , bmpRC。Height)—wndRC.Height());
m_ImagePanel.SetScrollRan(eSB_HORZ , 0,bmpRC。Width()—wndRC。Width ());
}
}
8. 处理保存按钮事件
3。3图像缩放模块设计
1. 新建一个对 28、话框类,类名为CStretchImage界面如下:
2. 向对话框中添加按钮、静态文本、群组框、滑块、复选框、图片等控件.
3. 设置控件属性如下:
4. 处理…、缩放、保存按钮事件。
13 / 16
详细设计说明书
3。4图片水印效果模块设计
1. 实现水印效果主要代码为:
2. 创建一个对话框类,类名为CImageWater。
3. 向对话框中添加按钮、静态文本、群组框、滑块、复选框、图片等控件.界面如下:
4. 设置控件属性如下:
5. 处理…、缩放、保存按钮事件。
3。5照片版式处理模块设计
1. 创建一个对话框类,类名为CPhotoHandle。
2. 向 29、对话框中添加按钮、静态文本、群组框、滑块、复选框、图片等控件。界面如下:
3. 设置控件属性如下:
4. 处理…、缩放、保存按钮事件。
3.5 PSD文件浏览模块设计
1. 创建一个对话框类,类名为CPsdBrowse。
2. 向对话框中添加按钮、静态文本、群组框、滑块、复选框、图片等控件。界面如下:
3. 设置控件属性如下:
4. 处理…、缩放、保存按钮事件.
14 / 16
详细设计说明书
4位图数据的存储形式
在进行图像处理时,一个首要的问题是实现对位图数据的直接操作。位图主要由四部分组成,分别为位图文件头、位图信息头、调色板和实际的位图数据如下:
,
其中,位图文件头对应的结构为BITMAPFILEHEADER,共占用
14个字节,定义如下:
位图信息头对应的结构为BITMAPINFOHEADER,共占用40个
字节,定义如下:
5限制条件
1。位图数据每行的字节数必须是4的整数倍。
2。位图数据是从下向上存储的。
3。对于真彩图来说,每一行数据是按照BRG颜色顺序排列的.
6测试计划
进入主界面
预期结果
点击图片旋转
进行操作旋转效果
点击图片缩放
进行操作缩放效果
点击水印效果
进行操作水印效果
点击照片版式
进行操作查看效果
点击退出
退出程序
15 / 16






