江南大学学士毕业论文--图像处理的程序设计--基于vc6内容摘要:
TMAPINFO 结构和图像数据就可以了。 DIB 的编 程 DIB(Independent Bitmap) API 函数库中的有些重要函数在以后的程序设计中经常用到,现列举如下: 1. FindDIBBits() 参数 : LPSTR lpbi //指向 DIB 对象的指针 返回值 : LPSTR //指向 DIB 图像象素起始位置 说明 : 该函数计算 DIB 中图像象素的起始位置,并返回指向它的指针。 2. DIBWidth() 参数 : LPSTR lpbi //指向 DIB 对象的指针 返回值 : DWORD //DIB 中图像的宽度 说明 : 该函数返回 DIB 中图像的宽度。 对于 Windows DIB ,返回BITMAPINFOHEADER 中的 biWidth 值;对于其它返回 BITMAPCOREHEADER中的 bcWidth 值。 3. DIBHeight() 参数 : LPSTR lpDIB //指向 DIB 对象的指针 返回值 : DWORD // DIB 中图像的高度 说明 : 该函数返回 DIB 中 图 像 的 高 度。 对 于 Windows DIB , 返 回BITMAPINFOHEADER中的 biHeight值;对于其它返回 BITMAPCOREHEADER中的 bcHeight 值。 4. DIBNumColors() 江南大学学士学位论文 12 参数 : LPSTR lpbi //指向 DIB 对象的指针 返回值 : WORD //返回调色板中颜色的种数 说明 : 该函数返回 DIB 中调色板的颜色的种数。 对于单色位图,返回 2;对于 16 色位图,返回 16;对于 256 色位图,返回 256;对于真彩色位图( 24 位),没有调色板,返回 0。 对于 Windows 的 DIB, 实际颜色的数目可以比象素的位数要少。 对于这种情况,则返回一个近似的数值。 5. define WIDTHBYTES(bits) (((bits) + 31) / 32 * 4) 本章小结 在 Windows 的编程中,彩色图像的显示和处理是一个重要的课题。 位图既可以以资源的形式与程序绑在一起,也可以以文件的形式从外部装入。 联系位图时可以使用 API函数。 本章就此进行讨论。 江南大学学士学位论文 13 第四章 编程实现图像复合 图像变换 为了图像复合时变幻出各种效果,有时需要图像变换中的平移、旋转等操作来实现。 这里讨论的图像变换,可以看作图像不动而坐标系变动,变动后,该图像在新的坐标系下具有新的坐标值。 通常以点变换作为基础,把图像的一系列像素作几何变换后,显示新的像素即可产生新的图像。 平移 原理 在下图中,平移前的坐标为( x0,y0),变换后为( x1,y1)。 tx 是水平方向移动的距离, ty 是垂直方向移动的距离。 由图可知: x1 = x0 + tx y1 = y0 + ty 用二维变换矩阵来描述( x0,y0)和( x1,y1)之间的关系: x1 1 0 tx x0 江南大学学士学位论文 14 y1 = 0 1 ty y0 1 0 0 1 1 反变换可由矩阵的逆来求,如下所示: x0 1 0 tx x1 y0 = 0 1 ty y1 1 0 0 1 1 在这里,图像中每一个变换后的点都能在原图像 中找到相应的点。 但是这些变换后的点有可能超出原图像的范围。 在程序的实现中,将这些点丢弃,并在原图像的移出位置让它以白色显示。 编程实现 在 Graphics_czView 类里添加一个成员函数 InteMove( )来实现这一图像变换功能。 但是该函数仅局限于处理 BMP 图像。 具体实现如下: BOOL CGraphics_czView::InteMove(LPSTR lpDIBBits, LONG lWidth, LONG lHeight, LONG lXOffset, LONG lYOffset, WORD count) { //指向原图象的指针 LPSTR lpSrc。 LPSTR lpDst。 LPSTR lpNewDIBBits。 HLOCAL hNewDIBBits。 //循环变量 LONG i。 LONG j。 LONG k。 LONG i0。 LONG j0。 int s。 if(count= =0) s=3。 else if(count= =256) s=1。 else if(count= =16) s=2。 else s=8。 //图象 每行的字节数 LONG lLineBytes。 江南大学学士学位论文 15 if(s= =3||s= =1) { lLineBytes=WIDTHBYTES(lWidth*8*s)。 } else { lLineBytes=WIDTHBYTES(lWidth*8/s)。 } int tag。 int lWidth_1。 if(count= =0) { tag=3。 lWidth_1=lWidth。 } else { tag=1。 lWidth_1=lLineBytes。 } hNewDIBBits=LocalAlloc(LHND,lLineBytes*lHeight)。 if(hNewDIBBits= =NULL) { return FALSE。 } lpNewDIBBits=(char*)LocalLock(hNewDIBBits)。 for(i=0。 ilHeight。 i++) { for(j=0。 jlWidth_1。 j++) { lpDst=(char*)lpNewDIBBits+lLineBytes*i+j*tag。 i0=ilYOffset。 j0=jlXOffset。 if((j0=0)amp。 amp。 (j0lWidth)amp。 amp。 (i0=0)amp。 amp。 (i0lHeight)) { lpSrc=(char*)lpDIBBits+lLineBytes*i0+j0*tag。 for(k=0。 ktag。 k++) { *(lpDst+k)=*(lpSrc+k)。 } } else { 江南大学学士学位论文 16 for(k=0。 ktag。 k++) *((unsigned char*)lpDst+k)=255。 } } } memcpy(lpDIBBits,lpNewDIBBits,lLineBytes*lHeight)。 LocalUnlock(hNewDIBBits)。 LocalFree(hNewDIBBits)。 return true。 } 效果图 我们用一幅 BMP 图像的平移来演示图像平移前后的情形。 图 41 平 移前的图像 图 42 平移后的图像 旋转 原理 我们这里讨论的旋转是以图像的中心为旋转点进行旋转的。 旋转后,图像的大小并未发生改变,但是显示区域却有可能改变。 有两种显示方法,一种是增大图像的显示区域,使旋转后的图像能完全显示出来,如图 44;另一种方法是按原图像的区域显示,将区域之外的图像截掉。 原图像旋转后露出的空白区域,以白色填充,如图 45。 图 43 原图像 图 44 完全显示 图 45 截图显示 下面讨论旋转的算法: 如下图所示,点 (x0,y0)旋转 θ 角后到达点 (x1,y1)。 江南大学学士学位论文 17 由图可知: x1 = x0cos(θ)+y0sin(θ) y1 = x0sin(θ)+y0cos(θ) 用二维变换矩阵来描述( x0,y0)和( x1,y1)之间的关系: 反变换可由矩阵的逆来求 ,如下所示: 上面讨论的是以原点为中心进行的旋转。 如要按坐标系中的某一点进行旋转。 则需将平移变换与旋转变换结合起来考虑,实行复合变换。 假设以坐标系中的( a,b)为中心进行旋转,某点旋转前为( x0,y0),旋转后为( x1,y1),旋转后旋转中心变为( c,d)则二维变换矩阵为: 反变换可由矩阵的逆来求,如下所示: 可得: x0=x1cos(θ)+y1sin(θ)ccos(θ)dsin(θ)+a; y0=x1sin(θ)+y1cos(θ)csin(θ)dcos(θ)+b; 在以图像为中心进行旋转,且不扩大显示区域的实现中, a、 b、 c、 d 分别为: 江南大学学士学位论文 18 ,。 编程实现 在 Graphics_czView 类里添加一个成员函数 InteRotate( )来实现这一图像变换功能。 但是该函数仅局限于处理 BMP 图像。 具体实现如下: BOOL CGraphics_czView::InteRotate(LPSTR lpDIBBits, LONG lWidth, LONG lHeight, int angle, WORD count) { //指向原图象的指针 LPSTR lpSrc。 LPSTR lpDst。 LPSTR lpNewDIBBits。 HLOCAL hNewDIBBits。 //循环变量 LONG i。 LONG j。 LONG k。 LONG i0。 LONG j0。 LONG lLineBytes。 float RotateAngle。 float sina。 float cosa。 int s。 if(count= =0) s=3。 else if(count= =256) s=1。 else if(count= =16) s=2。 else s=8。 //图象每行的字节数 if(s= =3||s= =1) { lLineBytes=WIDTHBYTES(lWidth*8*s)。 江南大学学士学位论文 19 } else { lLineBytes=WIDTHBYTES(lWidth*8/s)。 } int tag。 int lWidth_1。 if(count= =0) { tag=3。 lWidth_1=lWidth。 } else { tag=1。 lWidth_1=lLineBytes。 } RotateAngle=(float)(angle*)。 sina=(float)sin((double)RotateAngle)。 cosa=(float)cos((double)RotateAngle)。 hNewDIBBits=LocalAlloc(LHND,lLineBytes*lHeight)。 if(hNewDIBBits= =NULL) { return FALSE。 } lpNewDIBBits=(char*)LocalLock(hNewDIBBits)。 for(i=0。 ilHeight。 i++) { for(j=0。 jlWidth_1。 j++) { lpDst=(char*)lpNewDIBBits+lLineBytes*i+j*tag。 i0=(LONG)(i*cosaj*sina(lHeight1)*cosa*+(lWidth1)*sina* +(lHeight1)*)。 j0=(LONG)(i*sina+j*cosa(lHeight1)*。江南大学学士毕业论文--图像处理的程序设计--基于vc6
相关推荐
设计是成功的关键,是整个系统设计的基础。 本系统要求每份测试试卷有单项选择题和填空题,所以需要保存学生信息的student 表、单选题的 danxuan 表、填空题的 tiankong 表、试卷的 test 表;又每个测试有人员的规定,就需要一个学生与测试相关的 testuser 表;查询成绩需要 score 表;教师管理需要 teacher 表;知识点的管理就需要 knowl 表。
1、农业技术全集之植,烂病”的防治 烂铃、烂桃是棉花的多发性常见病害,严重影响棉花的产量和品质,人们习惯上把这两种病称之为“双烂病”。 (一)发生原因1、氮肥施用过量或过迟,造成棉花生长过旺,田间郁闭,致使棉花植株抗病害能力减弱。 2、棉花花铃期遭遇暴雨或秋雨过多,田间湿度过大,排水不良,致使病菌滋生和侵入。 3、棉花遭受红腐病、炭疽病和铃疫病等的侵害。 (二)防治措施1、控制田间湿度。
............... 11 致谢 ........................................................................ 6 5 正文撰写要求: 正文字数要求 1202015000 字。 正文内容要求 小四号宋体 , 采用 多倍行距,设置为。 一级题序及标题:三号黑体,局中; 二级题序及标题:小三号黑体 ,题序号顶格
据砼拌和物 的和易性和搅拌机的性能确定搅拌时间,搅拌最长时间不得超过最短时间的 3 倍, 350L 自落式搅拌机拌制低流动性砼最短时间需 17 105S; 严格控制砼运输时间,其允许最长时间是根据水泥初凝时间及施工气温确定,在运输砼过程中,为防止砼产生离析,装料高度控制在 以内,并要防止漏浆; 模板采用钢模板,钢模板应保证无缺损,有足够的刚度,内侧和顶、底面均保证光结、平整、顺直