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++图像处理 -- 文章索引

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值