选择显示字体大小

利用c语言实现计算机图像处理的方法

  1.图像平移

  图像平移只是改变图像在屏幕上的位置,图像本身并不发生变化。

  假设原图像区域左上角坐标为(x0, y0),右下角坐标为(x1, y1),将图像分别沿x和y轴平移dx和dy,则新图像的左上角坐标为(x0 + dx, y0 + dy),右下角坐标为(x1 + dx, y1 + dy)。坐标平移变换公式为:

  x′ = x + dx
  y′ = y + dy

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

  ⑴ 保存原图像到缓冲区。

  ⑵ 擦除原图像。

  ⑶ 计算平移后的新坐标。

  ⑷ 在新的坐标位置重新显示原图像。

  其中,擦除原图像的方法与图形变换中擦除原图形的方法一致,在实现中仍采用xor异或方式画图擦除原图像。对于新坐标值的计算还需要考虑边界情况,不要在图像平移后超出允许的屏幕范围。此外,如果采用c函数getimage()和putimage()来保存和恢复图像,则图像的大小不能超过64k。

  2.图像颠倒

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

  (1) 用getimage()保存原图像,并擦除原图像。

  (2) 计算图像的高度,即行数height;计算图像宽度width;计算保存一行图像信息

   height = bottom - top + 1;
  width = right - left + 1;
  linebytes = (width + 7) / 8 * 4;

  (3)利用行交换缓冲区linebuf在图像内存缓冲区中进行信息交换,即把第一行与最末行交换,第2行与第n-1行交换……,依此类推,直至 全部交换完毕。

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

  3.图像镜像变换

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

  首先,对于左上角为(left, top),右下角为(right, bottom)矩形区域图像,给出其中任意点(x0, y0)镜像变换后的新坐标(x′, y′)的坐标变换公式:

  x′ = right - x0 + left
  y′ = y0

  根据以上公式,对各个像素点计算新坐标后,直接把它显示在屏幕的相应位置上。

  如果完全逐点地进行交换,处理一个像素点就要读取一次像素值,从而降低了变换速度。由于像素点是顺序存放在各个bit位上,每读取一个字节就包含了8个像素点的信息,只需设置不同的位屏值bitmask,就可以获得不同像素点的信息。因此采用按行逐字节变换的方式,每读一次就进行8个像素点的变换,以提高变换速度。

  将一矩形区域的图像进行镜像变换的基本步骤如下:

  (1) 用getimage()把图像保存到内存缓冲区,并擦除原图像。

  (2) 计算图像高度,即行数高度height和宽度width;计算保存一行图像信息占用的字节数linebytes。计算公式如下:

  height = bottom - top + 1;
  width = right - left + 1;
  linebyte = (width + 7) / 8 *4;

  (3) 对图像进行镜像。

  (4)释放内存图像缓冲区。

  4.图像旋转

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

  假设图像的左上角为(left, top),右下角为(right, bottom),则图像上任意点(x0, y0)绕其中心(xcenter, ycenter)逆时针旋转angle角度后,新的坐标位置(x′, y′)的计算公式为:

xcenter = (right - left + 1) / 2 + left;
ycenter = (bottom - top + 1) / 2 + top;
x′ = (x0 - xcenter) cosθ - (y0 - ycenter) sinθ + xcenter;
y′ = (x0 - xcenter) sinθ + (y0 - ycenter) cosθ + ycenter;

  与图像的镜像变换相类似,也采用按行逐点变换的方式实现图像的旋转,其步骤如下:

  (1) 用getimage()把图像保存到内存缓冲区,并擦除原图像。

  (2) 计算图像高度height,宽度width,及保存一行图像信息占用的字节数linebytes,计算公式与镜像变换的计算公式相同。

  (3) 对图像逐行进行旋转变换。

  (4) 释放内存图像缓冲区。

  值得指出的是,这种处理方法不够。为此可以采用另一种方法:先在图像变换缓冲区中处理完毕后,再将变换后的图像一次显示在屏幕上。这样可以取得较好的显示效果。


 


关键字 本文所属关键字

相关 与本文相关文章

分类 所有文章关键字导航

源码编程相关

Java   Asp   PHP   .Net   XML   C/C++   CGI   VB   Jsp   J2ee   J2se   J2me   EJB   Servlet   Tomcat   Resin   Struts   Weblogic   Eclipse   ANT   GUI   JMS   Web servise   IDEA   Webphere   Hibernate   Spring   Jboss   Applet   Swing   Socket   Javamail   Perl   Ajax   P2P   安全   模式   框架   测试   开源   游戏

SQL数据库相关

My-SQL   Ms-SQL   Access   DB2   Oracle   Sybase   SQLserver   索引   存储过程   加密   数据库   分页   视图  

手机无线相关

3G   Wap   CDMA   GRPS   GSM   IVR   彩信   短信   无线   增值业务

网页设计制作相关

HTML   CSS   网页配色   网页特效   Javascript   VBscript   Dreamweaver   Frontpage   JS   Web   网站设计

网站建设推广相关

建站经验   网站优化   网站排名   推广   Alexa

操作系统/服务器相关

Windows XP   Windows 2000   Windows 2003   Windows Me   Windows 9.x   Linux   UNIX   注册表   操作系统   服务器   应用服务器

图形图像多媒体相关

Photoshop   Fireworks   Flash   Coreldraw   Illustrator   Freehand   Photoimpact   多媒体   图形图像

标准 网站致力的规范

Valid CSS!

无不良内容,无不良广告,无恶意代码

Valid XHTML 1.0 Transitional

creativecommons