位图的旋转 (Bitmap Rotation)

本文介绍了Windows平台下的图像处理技术,包括图像平移、颠倒、镜像变换及任意角度旋转等基本操作。通过实例讲解了如何使用API函数进行图像处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Windows提供了一个函数,用于将矩形的位图拷贝到一个平行四边形中,这个函数就是PlgBlt()。在转换时,要将矩形位图DC作为源DC,而将平行四边形DC作为目标DC。有关旋转和World   units(译者注:这个词未译出)的资料请参见VC联机帮助中Coordinate   Spaces   和   Transformations   中的内容。    
   
  位图的比例缩放   (Bitmap   Scaling)    
  Win32   API也提供了一个按比例缩放位图的函数,它就是StretchBlt()。它可以将源设备描述表(DC)中的矩形位图传送到目标设备描述表中。但不同于BitBlt()函数,StretchBlt()允许应用程序指定源、目标位图的尺寸。如果应用程序指定的目标位图尺寸比源位图尺寸小,则系统将压缩源位图以符合目标位图尺寸。同时,你也可以指定该函数的压缩方式,使用SetStretchBitMode()函数。当目标位图的尺寸大于源位图时,系统将拉伸源位图(即扩大像素的颜色范围)以符合要求。    
   
  /////////////////////////////////////////////////////////////////////////////////   
 图像的基本操作处理  
   
    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)点处。注意在新缓冲区中与原图没有对应的象素点的值用白色代替。   
    
   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值