C++图像处理 -- 图像翻转(镜像)
阅读提示:
《C++图像处理》系列以代码清晰,可读性为主,全部使用C++代码。
《Delphi图像处理》系列以效率为侧重点,一般代码为PASCAL,核心代码采用BASM。
尽可能保持二者内容一致,可相互对照。
本文代码必须包括《C++图像处理 -- 数据类型及公用函数》文章中的BmpData.h头文件。
对图像的翻转处理,是产生一个与原图像在水平方向或者垂直方向相对称的镜像图像。
图像翻转的原理很简单,就是以图像的中间列像素(水平方向),或者中间行像素(垂直方向)为基列(行),将图像第一列(行)的像素与图像最后一列(行)的像素相交换,图像第二列(行)的像素与图像倒数第二列(行)的像素相交换......,直至基列(行)为止,如果图像的列(行)数是偶数,则头尾对应的列(行),包括基列(行)在内两两交换,如果图像的列(行)数是偶数,则基列(行)不变,其它头尾对应的列(行)两两交换。
下面是图像翻转的实现代码和例子程序(使用BCB2010和GDI+):
//---------------------------------------typedef enum{ReversalModeHorizontal,// 水平翻转ReversalModeVertical// 垂直翻转}ReversalMode;// 图像翻转(镜像)VOID ImageReversal(BitmapData *data, ReversalMode mode){UINT width = data->Width;UINT height = data->Height;INT srcOffset = data->Stride >> 2;INT dstOffset, delta;PARGBQuad pd, ps;ARGB color;if (mode == ReversalModeHorizontal){pd = (PARGBQuad)data->Scan0;ps = pd + width - 1;dstOffset = srcOffset;delta = -1;width >>= 1;}else{ps = (PARGBQuad)data->Scan0;pd = ps + (height - 1) * srcOffset;dstOffset = -srcOffset;delta = 1;height >>= 1;}for (UINT y = 0; y < height; y ++, pd += dstOffset, ps += srcOffset){PARGBQuad pd0 = pd;PARGBQuad ps0 = ps;for (UINT x = 0; x < width; x ++, pd0 ++, ps0 += delta){color = pd0->Color;*pd0 = *ps0;ps0->Color = color; }}}//---------------------------------------void __fastcall TForm1::Button3Click(TObject *Sender){Gdiplus::Bitmap *bmp = new Gdiplus::Bitmap(L"..\\..\\media\\IMG_9440_mf.jpg");Gdiplus::Graphics *g = new Gdiplus::Graphics(Canvas->Handle);// 画原图g->DrawImage(bmp, 0, 0);BitmapData data;LockBitmap(bmp, &data);ImageReversal(&data, ReversalModeHorizontal);UnlockBitmap(bmp, &data);// 画翻转后的镜像图g->DrawImage(bmp, data.Width, 0);delete g;delete bmp;}//---------------------------------------
例子运行后的镜像效果图如下,左边是原图,右边是水平镜像图:
因水平有限,错误在所难免,欢迎指正和指导。邮箱地址:maozefa@hotmail.com
这里可访问《C++图像处理 -- 文章索引》。