资源描述
案卷号
日期
图像处理系统
详细设计说明书
作 者: YOUNG REGIN GROUP团队
完成日期: 2016.8。24
签 收 人:
签收日期:
修改情况记录:
版本号
修改批准人
修改人
修改日期
签收人
1。0
杨开
2016。8.23
1.1
杨开
2016。8.24
详细设计说明书
目录
1 引言 2
1。1 编写目的 2
1。2 背景 2
1.3 定义 2
1.4 参考资料 2
2 程序系统的结构 3
3 系统登陆设计说明 4
3。1 主窗口设计 4
3.2 图像旋转模块功能设计 4
3。3图像缩放模块设计 4
3.4 图片水印效果模块设计 5
3。5 照片版式处理模块设计 5
3.6 流程逻辑 6
4 位图数据的存储形式
5 限制条件 4
6 测试计划 4
1 引言
1.1 编写目的
本详细设计说明书主要目的是对图像管理系统的功能设计进行详尽的说明。
本说明书主要写了图像管理系统功能模块的详细设计,为后来的开发提供依据与参考。
详细设计说明书面向人员有:程序设计人员、数据库设计人员,质量检测人员。
1。2 背景
a. 项目名称:图像管理系统
b. 本项目的任务提出者:西安软件服务外包学院
开发者:YOUNG REGIN GROUP 团队
1。3 定义
本系统属于开发小型的图像处理软件,主要用于实现图像的显示与批量转换操作。
实现各种图像格式的显示。
支持图像的单一转换与批量转换。
实现位图的各种常规操作。
1。4 参考资料
《C++程序设计》,谭浩强,清华大学出版社;
《Visual C++项目开发案例全程实录》,梁水,李伟明著,清华大学出版社。
图像处理模块
2 程序系统的结构
退出系统
主窗体
批量转换与处理
照片处理
PSD文件管理
打开位图
图像锐化处理
图像反色处理
图像旋转
位图转换成GIF
图像浮雕效果
水印效果批量处理
PSD文件批量转换
PSD文件浏览
位图转换成GIF
位图转换为PNG
水印效果批量处理
GIF转换成位图
JPEG转换成位图
位图转换成JPEG
这是“图像管理系统”的整体系统结构图。
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,”照片版式处理");
设置状态栏,关联图标资源:
UINT nID; //控制状态栏里面的分栏
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));
m_ImageList。Add(::AfxGetApp()->LoadIcon(IDI_ICON1));
m_ImageList.Add(::AfxGetApp()->LoadIcon(IDI_ICON2));
m_ImageList.Add(::AfxGetApp()—>LoadIcon(IDI_ICON4));
m_ImageList.Add(::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()->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 control notification handler code here
CFileDialog flDlg(TRUE,"",”",OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,”位图文件|*.bmp||”,this);
if (flDlg.DoModal()==IDOK)
{
CString csFileName = 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;
}
CFile file;
file。Open(csFileName,CFile::modeRead);
file.Read(&m_bmFileHeader,sizeof(BITMAPFILEHEADER));
file。Read(&m_bmInfoHeader,sizeof(BITMAPINFOHEADER));
int szPalette = 0;
if (m_bmInfoHeader。biBitCount != 24)
{
file.Close();
MessageBox(”请选择真彩色位图!”,"提示");
return;
}
if (m_bmInfoHeader.biSizeImage == 0)
{
int externWidth;
//计算源位图每行使用的字节数
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);
}
int nBmpData = m_bmInfoHeader.biSizeImage;
if (m_pBmpData != NULL)
{
delete []m_pBmpData;
m_pBmpData = NULL;
}
m_pBmpData = new BYTE[nBmpData];
file.ReadHuge(m_pBmpData,nBmpData);
file。Close();
int sizeofbuffer = m_bmInfoHeader.biWidth * m_bmInfoHeader。biHeight * 4;
int externWidth;
externWidth = m_bmInfoHeader.biWidth * 3;
if(externWidth % 4 != 0)
externWidth = 4 - externWidth % 4;
else
externWidth = 0;
int k = 0;
BYTE* m_pImageTempBuffer = new BYTE[sizeofbuffer];
for (int n = m_bmInfoHeader。biHeight - 1; n 〉= 0; n—-)
{
for (UINT m = 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 = 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, 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.处理旋转按钮事件
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 = pButton—>GetCheck();
}
if (nState) //预定角度
{
for (int nID = IDC_ROTATE45; nID <= IDC_ROTATE270; nID++)
{
pButton = (CButton*)GetDlgItem(nID);
if (pButton != NULL)
{
nState = pButton—〉GetCheck();
if (nState)
{
CString csText;
pButton-〉GetWindowText(csText);
int nPos = csText.Find("°");
nDegree = atoi(csText.Left(nPos));
break;
}
}
}
}
else //固定角度
{
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.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);
else
byByteAlign = 0;
BYTE byZeroData = 0;
BYTE* pTmpData = pBmpData;
for (int y=0 ;y<outHeight;y++)
{
for (int x=0;x〈outWidth;x++)
{
memcpy(pTmpData,pListData,3);
pTmpData += 3;
pListData += 4;
}
for (int i=0; i〈byByteAlign; i++)
{
memcpy(pTmpData,&byZeroData,1);
pTmpData =pTmpData + 1;
}
pListData -= 2L*outWidth*4;
}
CDC *pDC = m_Image.GetDC();
BITMAPINFO bInfo;
bInfo.bmiHeader = m_bmInfoHeader;
HBITMAP hBmp = m_Image。SetBitmap(CreateDIBitmap(pDC->m_hDC,&m_bmInfoHeader,CBM_INIT,pBmpData,&bInfo,DIB_RGB_COLORS));
if (hBmp != NULL)
{
::DeleteObject(hBmp);
}
delete [] pBmpData;
//设置滚动范围
CRect bmpRC,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());
}
}
8.处理保存按钮事件
3。3 图像缩放模块设计
1.新建一个对话框类,类名为CStretchImage,界面如下:
2.向对话框中添加按钮、静态文本、群组框、滑块、复选框、图片等控件.
3.设置控件属性如下:
4.处理…、缩放、保存按钮事件。
3。4 图片水印效果模块设计
1.实现水印效果主要代码为:
2.创建一个对话框类,类名为CImageWater。
3。向对话框中添加按钮、静态文本、群组框、滑块、复选框、图片等控件.界面如下:
4.设置控件属性如下:
5.处理…、缩放、保存按钮事件。
3。5 照片版式处理模块设计
1.创建一个对话框类,类名为CPhotoHandle。
2.向对话框中添加按钮、静态文本、群组框、滑块、复选框、图片等控件。界面如下:
3.设置控件属性如下:
4.处理…、缩放、保存按钮事件。
3.5 PSD文件浏览模块设计
1.创建一个对话框类,类名为CPsdBrowse。
2.向对话框中添加按钮、静态文本、群组框、滑块、复选框、图片等控件。界面如下:
3.设置控件属性如下:
4.处理…、缩放、保存按钮事件.
4 位图数据的存储形式
在进行图像处理时,一个首要的问题是实现对位图数据的直接操作。位图主要由四部分组成,分别为位图文件头、位图信息头、调色板和实际的位图数据如下:
,
其中,位图文件头对应的结构为BITMAPFILEHEADER,共占用14个字节,定义如下:
位图信息头对应的结构为BITMAPINFOHEADER,共占用40个字节,定义如下:
5 限制条件
1.位图数据每行的字节数必须是4的整数倍。
2。位图数据是从下向上存储的。
3。对于真彩图来说,每一行数据是按照BRG颜色顺序排列的.
6 测试计划
进入主界面
预期结果
点击图片旋转
进行操作旋转效果
点击图片缩放
进行操作缩放效果
点击水印效果
进行操作水印效果
点击照片版式
进行操作查看效果
点击退出
退出程序
15 / 16
展开阅读全文