图像几何变换之图像位置变换之图像旋转
2013-07-10 12:43
411 查看
图像旋转本质是以图像的中心为原点,将图像上的所有像素都旋转一个相同的角度
算法描述:
1)将源图像保存到缓冲区,并记录下缓冲区的地址
2)获取源图像的高度和宽度,计算出源图像的中心点坐标(a0, b0)。以(a0,b0)为坐标原点,计算出源图像4个顶点的坐标。
3)采用某种交互方式(如对话框),获取图像的旋转角度。
4)分配内存,以保存旋转后的图像
5)根据步骤3)中设定的旋转角度及源图像中每个像素点的坐标值,获得旋转后各像素点的新坐标值,实现图像的旋转。根据源图像4个顶点的坐标旋转后的坐标值,确定新
图像中心及高度和宽度,不显示已经超出范围的图像。
算法实现:
/*************************************************************************
* 函数名称:Rotate(LPSTR lpSrcDib, LPSTR lpSrcStartBits,long lWidth, long lHeight,
long lLineBytes, WORD palSize, long lDstWidth,
long lDstHeight,long lDstLineBytes,float fSina, float fCosa)
* 函数参数:
* LPSTR lpSrcDib,指向源DIB的指针
* LPSTR lpSrcStartBits,指向源DIB的起始像素的指针
* long lWidth,源DIB图像宽度
* long lHeight,源DIB图像高度
* long lLineBytes,源DIB图像字节宽度(4的倍数)
* WORD palSize,源DIB图像调色板大小
* long lDstWidth,目标图像宽度
* long lDstHeight,目标DIB图像高度
* long lDstLineBytes,目标DIB图像行字节数(4的倍数)
* float fSina,旋转角的余弦,说明:为了避免两次求取正余弦,这里作为两个函数参数来用
* float fCosa,旋转角的正弦
* 函数类型:HGLOBAL
* 函数功能:用来旋转DIB图像
************************************************************************/
HGLOBAL Rotate(LPSTR lpSrcDib, LPSTR lpSrcStartBits,long lWidth, long lHeight,
long lLineBytes, WORD palSize, long lDstWidth,
long lDstHeight,long lDstLineBytes,float fSina, float fCosa)
{
float varFloat1; //浮点参数变量1
float varFloat2; //浮点参数变量2
LPSTR lpDstDib; //指向临时图像的指针
long i; //行循环变量
long j; //列循环变量
long i1; //行循环变量
long j1; //列循环变量
LPSTR lpSrcDIBBits; //指向源像素的指针
LPSTR lpDstDIBBits; //指向临时图像对应像素的指针
LPSTR lpDstStartBits; //指向临时图像对应像素的指针
LPBITMAPINFOHEADER lpbmi;// 指向BITMAPINFOHEADER结构的指针
varFloat1= (float) (-0.5 * (lDstWidth - 1) * fCosa - 0.5 * (lDstHeight - 1) * fSina// 将经常用到的两个常数事先求出,以便作为常数使用
+ 0.5 * (lDstWidth - 1));
varFloat2= (float) ( 0.5 * (lDstWidth - 1) * fSina - 0.5 * (lDstHeight - 1) * fCosa
+ 0.5 * (lDstHeight - 1));
HGLOBAL hDIB = (HGLOBAL) ::GlobalAlloc(GHND, lDstLineBytes * lDstHeight + *(LPDWORD)lpSrcDib +palSize);// 分配内存,以保存新DIB
if (hDIB == NULL)// 判断是否是有效的DIB对象
{
return FALSE;// 不是,则返回
}
lpDstDib= (char * )::GlobalLock((HGLOBAL) hDIB);// 锁定内存
memcpy(lpDstDib,lpSrcDib, *(LPDWORD)lpSrcDib +palSize);// 复制DIB信息头和调色板
lpbmi = (LPBITMAPINFOHEADER)lpDstDib;// 获取指针
lpbmi->biHeight=lDstHeight;// 更新DIB中图像的高度和宽度
lpbmi->biWidth =lDstWidth;
lpDstStartBits=lpDstDib+ *(LPDWORD)lpDstDib
+palSize;// 求像素起始位置,作用如同::FindDIBBits(gCo.lpSrcDib),这里尝试使用了这种方法,以避免对全局函数的调用
for(i = 0; i < lDstHeight; i++)// 行操作
{
for(j = 0; j < lDstWidth; j++)// 列操作
{
lpDstDIBBits= (char *)lpDstStartBits+ lDstLineBytes * (lDstHeight - 1 - i) + j;// 指向新DIB第i行,第j个像素的指针
i1= (long) (-((float) j) * fSina + ((float) i) * fCosa + varFloat2 + 0.5);// 计算该像素在源DIB中的坐标
j1= (long) ( ((float) j) * fCosa + ((float) i) * fSina + varFloat1 + 0.5);
if( (j1>= 0) && (j1< lWidth) && (i1>= 0) && (i1< lHeight))
{// 判断是否在源图内
lpSrcDIBBits= (char *)lpSrcStartBits+ lLineBytes * (lHeight - 1 -i1) + j1;// 指向源DIB第i0行,第j0个像素的指针
*lpDstDIBBits= *lpSrcDIBBits;// 复制像素
}
else
{
* ((unsigned char*)lpDstDIBBits) = 255;// 源图中不存在的像素,赋为255
}
}
}
return hDIB;
}
VC编程实现(基于VS2010):
代码链接:点击打开链接
算法描述:
1)将源图像保存到缓冲区,并记录下缓冲区的地址
2)获取源图像的高度和宽度,计算出源图像的中心点坐标(a0, b0)。以(a0,b0)为坐标原点,计算出源图像4个顶点的坐标。
3)采用某种交互方式(如对话框),获取图像的旋转角度。
4)分配内存,以保存旋转后的图像
5)根据步骤3)中设定的旋转角度及源图像中每个像素点的坐标值,获得旋转后各像素点的新坐标值,实现图像的旋转。根据源图像4个顶点的坐标旋转后的坐标值,确定新
图像中心及高度和宽度,不显示已经超出范围的图像。
算法实现:
/*************************************************************************
* 函数名称:Rotate(LPSTR lpSrcDib, LPSTR lpSrcStartBits,long lWidth, long lHeight,
long lLineBytes, WORD palSize, long lDstWidth,
long lDstHeight,long lDstLineBytes,float fSina, float fCosa)
* 函数参数:
* LPSTR lpSrcDib,指向源DIB的指针
* LPSTR lpSrcStartBits,指向源DIB的起始像素的指针
* long lWidth,源DIB图像宽度
* long lHeight,源DIB图像高度
* long lLineBytes,源DIB图像字节宽度(4的倍数)
* WORD palSize,源DIB图像调色板大小
* long lDstWidth,目标图像宽度
* long lDstHeight,目标DIB图像高度
* long lDstLineBytes,目标DIB图像行字节数(4的倍数)
* float fSina,旋转角的余弦,说明:为了避免两次求取正余弦,这里作为两个函数参数来用
* float fCosa,旋转角的正弦
* 函数类型:HGLOBAL
* 函数功能:用来旋转DIB图像
************************************************************************/
HGLOBAL Rotate(LPSTR lpSrcDib, LPSTR lpSrcStartBits,long lWidth, long lHeight,
long lLineBytes, WORD palSize, long lDstWidth,
long lDstHeight,long lDstLineBytes,float fSina, float fCosa)
{
float varFloat1; //浮点参数变量1
float varFloat2; //浮点参数变量2
LPSTR lpDstDib; //指向临时图像的指针
long i; //行循环变量
long j; //列循环变量
long i1; //行循环变量
long j1; //列循环变量
LPSTR lpSrcDIBBits; //指向源像素的指针
LPSTR lpDstDIBBits; //指向临时图像对应像素的指针
LPSTR lpDstStartBits; //指向临时图像对应像素的指针
LPBITMAPINFOHEADER lpbmi;// 指向BITMAPINFOHEADER结构的指针
varFloat1= (float) (-0.5 * (lDstWidth - 1) * fCosa - 0.5 * (lDstHeight - 1) * fSina// 将经常用到的两个常数事先求出,以便作为常数使用
+ 0.5 * (lDstWidth - 1));
varFloat2= (float) ( 0.5 * (lDstWidth - 1) * fSina - 0.5 * (lDstHeight - 1) * fCosa
+ 0.5 * (lDstHeight - 1));
HGLOBAL hDIB = (HGLOBAL) ::GlobalAlloc(GHND, lDstLineBytes * lDstHeight + *(LPDWORD)lpSrcDib +palSize);// 分配内存,以保存新DIB
if (hDIB == NULL)// 判断是否是有效的DIB对象
{
return FALSE;// 不是,则返回
}
lpDstDib= (char * )::GlobalLock((HGLOBAL) hDIB);// 锁定内存
memcpy(lpDstDib,lpSrcDib, *(LPDWORD)lpSrcDib +palSize);// 复制DIB信息头和调色板
lpbmi = (LPBITMAPINFOHEADER)lpDstDib;// 获取指针
lpbmi->biHeight=lDstHeight;// 更新DIB中图像的高度和宽度
lpbmi->biWidth =lDstWidth;
lpDstStartBits=lpDstDib+ *(LPDWORD)lpDstDib
+palSize;// 求像素起始位置,作用如同::FindDIBBits(gCo.lpSrcDib),这里尝试使用了这种方法,以避免对全局函数的调用
for(i = 0; i < lDstHeight; i++)// 行操作
{
for(j = 0; j < lDstWidth; j++)// 列操作
{
lpDstDIBBits= (char *)lpDstStartBits+ lDstLineBytes * (lDstHeight - 1 - i) + j;// 指向新DIB第i行,第j个像素的指针
i1= (long) (-((float) j) * fSina + ((float) i) * fCosa + varFloat2 + 0.5);// 计算该像素在源DIB中的坐标
j1= (long) ( ((float) j) * fCosa + ((float) i) * fSina + varFloat1 + 0.5);
if( (j1>= 0) && (j1< lWidth) && (i1>= 0) && (i1< lHeight))
{// 判断是否在源图内
lpSrcDIBBits= (char *)lpSrcStartBits+ lLineBytes * (lHeight - 1 -i1) + j1;// 指向源DIB第i0行,第j0个像素的指针
*lpDstDIBBits= *lpSrcDIBBits;// 复制像素
}
else
{
* ((unsigned char*)lpDstDIBBits) = 255;// 源图中不存在的像素,赋为255
}
}
}
return hDIB;
}
VC编程实现(基于VS2010):
代码链接:点击打开链接
相关文章推荐
- 图像几何变换之图像位置变换之图像平移
- 图像几何变换之图像位置变换之图像镜像
- FLASH处理图像的移动、缩放、旋转、颜色变换的类推荐。
- 图像几何变换(缩放、旋转)中的常用的插值算法
- Matlab图像几何变换之图像旋转
- 图像几何变换:旋转,缩放,斜切
- OpenCV-图像几何变换:旋转,缩放,斜切 .
- 【OpenCV】图像几何变换:旋转,缩放,斜切
- OpenCV2:图像的几何变换,平移、镜像、缩放、旋转(2)
- 图像中某点绕点旋转后的坐标,图像旋转坐标位置
- 图像几何变换(缩放、旋转)中的插值算法
- android 矩形变换 图像旋转
- 【图像处理】图像几何变换基础(非弹性变换下如何计算旋转矩阵)
- 图像变换 - 图像拉伸、收缩、扭曲、旋转- 仿射变换(cvWarpAffine)
- 图像处理学习笔记之图像的几何变换(4)镜像变换
- 数字图像的几何变换(旋转、放缩、平移)详解(-)
- OpenCV2:图像的几何变换,平移、镜像、缩放、旋转(1)
- matlab 图像几何变换 平移、旋转、缩放
- OpenCV2:图像的几何变换,平移、镜像、缩放、旋转(1)
- 【OpenCV & Python】图像几何变换:旋转,缩放,平移