镜像是两个物体关于中轴线对称的一种状态。
图像的镜像分为两种:水平镜像、垂直镜像
水平镜像:是将图像左半部分和右半部分以图像垂直中轴线为中心进行镜像对换
垂直镜像:是将图像上半部分和下半部分以图像水平中轴线为中心进行镜像对换。
算法描述:
1)将源图像保存到缓冲区,并记录下缓冲区的地址。
2)分配内存,以保存镜像后的图像。
3)确定图像的镜像方式,是水平镜像还是垂直镜像。
4)根据设定的镜像方式及源图中每个像素点的坐标值,计算出镜像后各像素点的新坐标值,实现图像的镜像。
/*************************************************************************
* 函数名称:Mirror(LPSTR lpSrcStartBits, long lWidth, long lHeight,long lLineBytes)
* 函数参数:
LPSTR lpSrcStartBits,指向DIB起始像素的指针
long lWidth,DIB图像的宽度
long lHeight,DIB图像的高度
long lLineBytes,DIB图像的行字节数,为4的倍数
* 函数类型:BOOL
* 函数功能:该函数用来镜像DIB图像,本程序只实现了水平镜像,垂直镜像的原理书中也谈到。 很容易实现
************************************************************************/
BOOL Mirror(LPSTR lpSrcStartBits, long lWidth, long lHeight,long lLineBytes)
{
long i; //行循环变量
long j; //列循环变量
LPSTR lpSrcDIBBits; //指向源像素的指针
LPSTR lpDstDIBBits; //指向临时图像对应像素的指针
HLOCAL hDstDIBBits; //临时图像句柄
LPSTR lpBits; // 指向中间像素的指针,当复制图像时,提供临时的像素内存空间
hDstDIBBits= LocalAlloc(LHND, lLineBytes);// 分配临时内存保存行图像
if (hDstDIBBits == NULL)
{
return FALSE; // 分配内存失败
}
lpDstDIBBits= (char * )LocalLock(hDstDIBBits);// 锁定
for(i = 0; i < lHeight; i++)// 水平镜像,针对图像每行进行操作
{
for(j = 0; j < lWidth / 2; j++)// 针对每行图像左半部分进行操作
{
lpSrcDIBBits= (char *)lpSrcStartBits + lLineBytes * i + j;// 指向倒数第i行,第j个像素的指针
lpBits= (char *)lpSrcStartBits + lLineBytes * (i + 1) - j;// 指向倒数第i+1行,倒数第j个像素的指针
*lpDstDIBBits=*lpBits;//保存中间像素
*lpBits = *lpSrcDIBBits;// 将倒数第i行,第j个像素复制到倒数第i行,倒数第j个像素
*lpSrcDIBBits=*lpDstDIBBits;// 将倒数第i行,倒数第j个像素复制到倒数第i行,第j个像素
}
}
LocalUnlock(hDstDIBBits);// 释放内存
LocalFree(hDstDIBBits);
return TRUE;
}
/*************************************************************************
* 函数名称:Mirror2(LPSTR lpSrcStartBits, long lWidth, long lHeight,long lLineBytes)
* 函数参数:
LPSTR lpSrcStartBits,指向DIB起始像素的指针
long lWidth,DIB图像的宽度
long lHeight,DIB图像的高度
long lLineBytes,DIB图像的行字节数,为4的倍数
* 函数类型:BOOL
* 函数功能:该函数用来垂直镜像DIB图像
************************************************************************/
BOOL Mirror2(LPSTR lpSrcStartBits, long lWidth, long lHeight,long lLineBytes)
{
long i; //行循环变量
long j; //列循环变量
LPSTR lpSrcDIBBits; //指向源像素的指针
LPSTR lpDstDIBBits; //指向临时图像对应像素的指针
HLOCAL hDstDIBBits; //临时图像句柄
LPSTR lpBits; // 指向中间像素的指针,当复制图像时,提供临时的像素内存空间
hDstDIBBits= LocalAlloc(LHND, lLineBytes);// 分配临时内存保存行图像
if (hDstDIBBits == NULL)
{
return FALSE; // 分配内存失败
}
lpDstDIBBits= (char * )LocalLock(hDstDIBBits);// 锁定
for(i = 0; i < lHeight / 2; i++)// 垂直镜像,针对图像每行进行操作
{
//for(j = 0; j < lWidth / 2; j++)// 针对每行图像左半部分进行操作
//{
lpSrcDIBBits= (char *)lpSrcStartBits + lLineBytes * i ;//+ j;// 指向倒数第i行,第j个像素的指针
lpBits= (char *)lpSrcStartBits + lLineBytes * (lHeight - i + 1);// - j;// 指向倒数第i+1行,倒数第j个像素的指针
memcpy(lpDstDIBBits, lpBits, lLineBytes);
memcpy(lpBits, lpSrcDIBBits, lLineBytes);
memcpy(lpSrcDIBBits, lpDstDIBBits, lLineBytes);
//*lpDstDIBBits=*lpBits;//保存中间像素
//*lpBits = *lpSrcDIBBits;// 将倒数第i行,第j个像素复制到倒数第i行,倒数第j个像素
//*lpSrcDIBBits=*lpDstDIBBits;// 将倒数第i行,倒数第j个像素复制到倒数第i行,第j个像素
//}
}
LocalUnlock(hDstDIBBits);// 释放内存
LocalFree(hDstDIBBits);
return TRUE;
}
VC编程实现(基于VS2010):
代码链接:点击打开链接