VisualC 6.0开发灰度位图处理(3)

2008-04-09 04:08:44来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折


 data=(unsigned char*)GlobalLock((HGLOBAL)data1handle);
 AfxGetApp()->BeginWaitCursor();
 int i,j,s,t,ms=1;
 int sum=0,sumw=0;
 int mask[3][3]={{-1,-1,-1},{-1,9,-1},{-1,-1,-1}};
 for(i=0; ibiHeight; i )
  for(j=0; jbiWidth; j )
   {
    sumw=0; sum=0;
    for(s=(-ms); s<=ms; s )
     for(t=(-ms); t<=ms; t )
      if(((i s)>=0) && ((j t)>=0) && ((i s)biHeight) && ((j t)biWidth))
      {
       sumw = mask[1 s][1 t];
      sum =*(hData (i s)*WIDTHBYTES(lpBi->biWidth*8) (j t))*mask[1 s][1 t];
}
     if(sumw==0) sumw=1; sum/=sumw;
     if(sum>255)sum=255;
     if(sum<0)sum=0;
       *(data i*WIDTHBYTES(lpBi->biWidth*8) j)=sum;
      }
     for( j=0; jbiHeight; j )
      for( i=0; ibiWidth; i )
*(hData i*WIDTHBYTES(lpBi->biWidth*8) j)=*(data i*WIDTHBYTES(lpBi->biWidth*8) j);
      AfxGetApp()->EndWaitCursor();
      GlobalUnlock((HGLOBAL)hdib);
      GlobalUnlock(data1handle);
      EndWaitCursor();
     Invalidate(TRUE);
 }

  四、图像的基本操作处理

  1、图像平移

  图像平移只是改变图像在屏幕上的位置,图像本身并不发生变化。假设原图像区域左上角坐标为(x0, y0),右下角坐标为(x1, y1),将图像分别沿x和y轴平移dx和dy,则新图像的左上角坐标为(x0 dx, y0 dy),右下角坐标为(x1 dx, y1 dy)。坐标平移变换公式为:

  x1 = x dx

  y1 = y dy

  在屏幕上实现图像的移动分为四个步骤:

  ⑴ 读原图像到缓冲区;

  ⑵ 擦除视图上原图像;

  ⑶ 计算平移后的新坐标。

  ⑷ 利用API函数::StretchDIBits()在新的左上角坐标位置处重新显示原图像。

  其中,擦除原图像的方法与图形变换中擦除原图形的方法一致,在实现中仍采用XOR异或方式画图擦除原图像。对于新坐标值的计算还需要考虑边界情况,不要在图像平移后超出允许的屏幕范围。

  2、图像颠倒

  图像颠倒是指把定义好的图像区域上下翻转地显示在屏幕上。分析图像颠倒的过程,可发现每行的图像信息都保持不变,而只是改变了行的顺序,将第一行与最后的第n行相互交换,第二行与第n - 1行交换……,依此类推,从而实现了图像的颠倒。只需采用按行交换的方式,即可方便地修改缓冲区内容,实现图像的颠倒。基本步骤如下:

  (1)将原图像读入缓冲区,并擦除原图像;

  (2) 计算图像的高度,即行数height;计算图像宽度width;根据宽度、高度生成新缓冲区;

  (3)把第一行与最末行交换,第2行与第n-1行交换……,依此类推,直至全部交换完毕。既原图中的(x、y)点,在新生成的图象中对应为x1=x,y1=height-1-y。把原图中的象素值读入新缓冲区的(x1,y1)点处。

  (4)把交换后的图像缓冲区内容重新显示在屏幕上。

  3、图像镜像变换

  镜像变换是指将指定区域的图像左右翻转地显示在屏幕。分析镜像变换过程可以发现:每行图像信息的处理方式是相同的,而且行顺序不发生变化,只是每一行的像素信息按从左到右的顺序进行了左右颠倒,从而实现了镜像变换。因此,采用按行逐点变换的方式实现图像的镜像。

  给出原图中的任意点(x, y)镜像变换后的新坐标(x1, y1)的坐标变换公式:

  x1 = width-x-1

  y1 = y

  根据以上公式,对各个像素点计算新坐标后,把原图中的象素值读入新缓冲区的(x1,y1)点处。

  4、图像任意角度的旋转

  图像旋转是指把定义的图像绕某一点以逆时针或顺时针方向旋转一定的角度,通常是指绕图像的中心以逆时针方向旋转。

  首先根据旋转的角度、图象对角线的长度计算旋转后的图像的最大宽度、高度,根据旋转后图象最大的宽度、高度生成新的缓冲区,假设图像的左上角为(left, top),右下角为(right, bottom),则图像上任意点(x, y)绕其中心(xcenter, ycenter)逆时针旋转angle角度后,新的坐标位置(x1, y1)的计算公式为:

  xcenter = (width 1)/2 left;

  ycenter = (height 1)/2 top;

  x1 = (x-xcenter) cosθ- (y - ycenter) sinθ xcenter;

  y1 = (x-xcenter) sinθ (y- ycenter) cosθ ycenter;

  与图像的镜像变换相类似,把原图中的象素值读入新缓冲区的(x1,y1)点处。注意在新缓冲区中与原图没有对应的象素点的值用白色代替。

  五、小结

  笔者开发的该图像处理程序在Windows98环境下编译通过,本文主要讲述了8bit灰度图像的处理,读者可以本文的基础上开发自己的针对二值、真彩色格式的图像处理系统。

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:初识VisualC .NET开发环境

下一篇:利用VisualC 实现AVI文件的图像截取

IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设

网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源

网站联盟: 联盟新闻 联盟介绍 联盟点评 网赚技巧

行业资讯: 搜索引擎 网络游戏 电子商务 广告传媒

网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它

服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护

软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷

网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash

程序设计: Java技术 C/C++ VB delphi

网络知识: 网络协议 网络安全 网络管理 组网方案 Cisco技术

操作系统: Win2000 WinXP Win2003 Mac OS Linux FreeBSD

热门词条
最新资讯
热门关注
热门标签