阅读提示:
《Delphi图像处理》系列以效率为侧重点,一般代码为PASCAL,核心代码采用BASM。
《C++图像处理》系列以代码清晰,可读性为主,全部使用C++代码。
尽可能保持二者内容一致,可相互对照。
本文代码必须包括文章《Delphi图像处理 -- 数据类型及公用过程》中的ImageData.pas单元。
对图像的翻转处理,是产生一个与原图像在水平方向或者垂直方向相对称的镜像图像。
图像翻转的原理很简单,就是以图像的中间列像素(水平方向),或者中间行像素(垂直方向)为基列(行),将图像第一列(行)的像素与图像最后一列(行)的像素相交换,图像第二列(行)的像素与图像倒数第二列(行)的像素相交换......,直至基列(行)为止,如果图像的列(行)数是偶数,则头尾对应的列(行),包括基列(行)在内两两交换,如果图像的列(行)数是偶数,则基列(行)不变,其它头尾对应的列(行)两两交换。
下面是图像翻转的实现代码:
下面给出一个完全等价的纯PAS代码图像翻转过程代码,供不太懂BASM代码的朋友学习和使用:
下面是个图像水平翻转的例子代码:
procedure TForm1.Button2Click(Sender: TObject);
var
bmp: TGpBitmap;
g: TGpGraphics;
data: TImageData;
begin
bmp := TGpBitmap.Create('..\..\media\001-1.jpg');
g := TGpGraphics.Create(Canvas.Handle);
g.DrawImage(bmp, 0, 0);
data := LockGpBitmap(bmp);
ImageReversal(data, rmHorizontal);
UnlockGpBitmap(bmp, data);
g.DrawImage(bmp, data.Width, 0);
g.Free;
bmp.Free;
end;
例子运行后的镜像效果图如下,左边是原图,右边是水平镜像图:
《Delphi图像处理》系列使用GDI+单元下载地址和说明见文章《GDI+ for VCL基础 -- GDI+ 与 VCL》。
因水平有限,错误在所难免,欢迎指正和指导。邮箱地址:maozefa@hotmail.com
这里可访问《Delphi图像处理 -- 文章索引》。