图像几何变换之图像位置变换之图像镜像
来源:互联网 发布:mac文件共享给windows 编辑:程序博客网 时间:2024/04/28 03:43
镜像是两个物体关于中轴线对称的一种状态。
图像的镜像分为两种:水平镜像、垂直镜像
水平镜像:是将图像左半部分和右半部分以图像垂直中轴线为中心进行镜像对换
垂直镜像:是将图像上半部分和下半部分以图像水平中轴线为中心进行镜像对换。
算法描述:
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):
代码链接:点击打开链接
- 图像几何变换之图像位置变换之图像镜像
- 图像几何变换之图像位置变换之图像平移
- 图像几何变换之图像位置变换之图像旋转
- Matlab图像的几何变换之图像镜像
- 图像处理学习笔记之图像的几何变换(4)镜像变换
- Matlab图像几何变换之图像旋转
- OpenCV 几何变换-图像镜像
- 图像镜像变换
- matlab之原始处理图像几何变换
- matlab之原始处理图像几何变换
- 图像的几何变换之坐标映射
- matlab之原始处理图像几何变换
- 图像的几何变换之坐标映射
- opencv之图像几何变换和放大
- 【数字图像处理】六.MFC空间几何变换之图像平移、镜像、旋转、缩放详解
- Matlab图像的几何变换之图像平移
- Matlab图像的几何变换之图像转置
- Matlab图像的几何变换之图像缩放
- andengine-2:andengine实现一个简单例子, 小球随手指移动
- android之写文件到sd卡
- linux中的kill命令 及 强制终止进程的方法
- boa cgi html
- 黑马程序员——函数的重载
- 图像几何变换之图像位置变换之图像镜像
- 创建JobClient遇到的错误
- 网络流之Dinic算法
- Hbase在大数据量应用
- 第一次写博客
- Hibenate的异常 关于hibernate-mapping的异常
- 树型视的三个结构TVINSERTSTRUCT、TVITEM、NMTREEVIEW
- 单片机控制W5300
- rqnoj-478整理队形