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;