////////////////////////////////////////////////////////////////
//参数说明:
// HWND hWnd:窗口句柄
//程序说明:图像的旋转
BOOL Rotation(HWND hWnd)
{
//定义对话框处理程序
DLGPROC dlgInputBox = NULL;
//设定偏移、内存、每行字节数
DWORD OffBits,SrcBufSize,DstBufSize,DstLineBytes;
//文件信息头指针
LPBITMAPINFOHEADER lpImgData;
//数据区指针
LPSTR lpPtr;
HLOCAL hTempImgData;
//中间转换用的文件信息头指针
LPBITMAPINFOHEADER lpTempImgData;
//转换用的数据去指针
LPSTR lpTempPtr;
//定义了旋转系数
float SrcX1,SrcY1,SrcX2,SrcY2,SrcX3,SrcY3,SrcX4,SrcY4;
float DstX1,DstY1,DstX2,DstY2,DstX3,DstY3,DstX4,DstY4;
//新旧文件的宽高
DWORD Wold,Hold,Wnew,Hnew;
//定义一个HDC
HDC hDc;
HFILE hf;
//用来计算象素的位置
DWORD x0,y0,x1,y1;
//两个三角变量
float cosa,sina;
float num1,num2;
//两个文件头结构
BITMAPFILEHEADER DstBf;
BITMAPINFOHEADER DstBi;
//实例化对话框
dlgInputBox = (DLGPROC) MakeProcInstance ( (FARPROC)InputBox, ghInst );
DialogBox (ghInst, "INPUTBOX", hWnd, dlgInputBox);
FreeProcInstance ( (FARPROC) dlgInputBox );
//产生旋转角度
RotateAngle=(float)RADIAN(RotateAngle);
//得到旋转的三角数值
cosa=(float)cos((double)RotateAngle);
sina=(float)sin((double)RotateAngle);
//源图像宽高
Wold=bi.biWidth;
Hold=bi.biHeight;
//计算源图像旋转后要显示的区域
SrcX1=(float)(-0.5*Wold);
SrcY1=(float)(0.5*Hold);
SrcX2=(float)(0.5*Wold);
SrcY2=(float)(0.5*Hold);
SrcX3=(float)(-0.5*Wold);
SrcY3=(float)(-0.5*Hold);
SrcX4=(float)(0.5*Wold);
SrcY4=(float)(-0.5*Hold);
//新图像对应数值
DstX1=cosa*SrcX1+sina*SrcY1;
DstY1=-sina*SrcX1+cosa*SrcY1;
DstX2=cosa*SrcX2+sina*SrcY2;
DstY2=-sina*SrcX2+cosa*SrcY2;
DstX3=cosa*SrcX3+sina*SrcY3;
DstY3=-sina*SrcX3+cosa*SrcY3;
DstX4=cosa*SrcX4+sina*SrcY4;
DstY4=-sina*SrcX4+cosa*SrcY4;
//新图像的宽高
Wnew = (DWORD)(max(fabs(DstX4-DstX1), fabs(DstX3-DstX2))+0.5);
Hnew = (DWORD)(max(fabs(DstY4-DstY1), fabs(DstY3-DstY2))+0.5);
num1=(float)( -0.5*Wnew*cosa-0.5*Hnew*sina+0.5*Wold);
num2=(float)(0.5*Wnew*sina-0.5*Hnew*cosa+0.5*Hold);
//得到数据到文件头的偏移
OffBits=bf.bfOffBits-sizeof(BITMAPFILEHEADER);
//源图像所需内存
SrcBufSize=bf.bfSize-sizeof(BITMAPFILEHEADER);
ImgWidth=Wnew;
ImgHeight=Hnew;
//目标图像每行字节数
DstLineBytes=(DWORD)WIDTHBYTES(Wnew*bi.biBitCount);
//目标图像所需内存
DstBufSize=(DWORD)(sizeof(BITMAPINFOHEADER)+NumColors*sizeof(RGBQUAD)+(DWORD)DstLineBytes*Hnew);
//查看内存分配
if((hTempImgData=LocalAlloc(LHND,DstBufSize))==NULL)
{
MessageBox(hWnd,"Error alloc memory!","Error Message",MB_OK|MB_ICONEXCLAMATION);
return FALSE;
}
//锁定内存区域指针指向数据区
lpImgData=(LPBITMAPINFOHEADER)GlobalLock(hImgData);
lpTempImgData=(LPBITMAPINFOHEADER)LocalLock(hTempImgData);
//转换成字节型指针
lpPtr=(char *)lpImgData;
lpTempPtr=(char *)lpTempImgData;
//初始化内存
memset(lpTempPtr,(BYTE)255,DstBufSize);
memcpy(lpTempPtr,lpPtr,OffBits);
//得到新的文件头和文件信息头
memcpy((char *)&DstBf,(char *)&bf,sizeof(BITMAPFILEHEADER));
memcpy((char *)&DstBi,(char *)&bi,sizeof(BITMAPINFOHEADER));
DstBf.bfSize=DstBufSize+sizeof(BITMAPFILEHEADER);
DstBi.biWidth=Wnew;
DstBi.biHeight=Hnew;
//用新文件信息覆盖文件信息头内容
memcpy(lpTempPtr,(char *)&DstBi,sizeof(BITMAPINFOHEADER));
//旋转操作
for(y1=0;y1<Hnew;y1++)
for(x1=0;x1<Wnew;x1++){
//得到横坐标和纵坐标在员图中的位置
x0= (DWORD)(x1*cosa+y1*sina+num1);
y0= (DWORD)(-1.0f*x1*sina+y1*cosa+num2);
//临界判断
if( (x0>=0) && (x0<Wold) && (y0>=0) && (y0<Hold))
{
//得到数据区位置
lpPtr=(char *)lpImgData+(SrcBufSize-LineBytes-y0*LineBytes)+x0;
lpTempPtr=(char *)lpTempImgData+(DstBufSize-DstLineBytes-y1*DstLineBytes)+x1;
//赋值
*lpTempPtr=*lpPtr;
}
}
//得到窗口的DC
hDc=GetDC(hWnd);
if(hBitmap!=NULL)
DeleteObject(hBitmap);
//创建位图
hBitmap=CreateDIBitmap(hDc, (LPBITMAPINFOHEADER)lpTempImgData, (LONG)CBM_INIT,
(LPSTR)lpTempImgData+sizeof(BITMAPINFOHEADER) +NumColors*sizeof(RGBQUAD),
(LPBITMAPINFO)lpTempImgData, DIB_RGB_COLORS);
//保存位图文件
hf=_lcreat("c:\\rotation.bmp",0);
_lwrite(hf,(LPSTR)&DstBf,sizeof(BITMAPFILEHEADER));
_lwrite(hf,(LPSTR)lpTempImgData,DstBufSize);
_lclose(hf);
//释放资源
ReleaseDC(hWnd,hDc);
LocalUnlock(hTempImgData);
LocalFree(hTempImgData);
GlobalUnlock(hImgData);
return TRUE;
}
没有合适的资源?快使用搜索试试~ 我知道了~
图像算法的核心程序
共19个文件
txt:19个
需积分: 9 21 下载量 22 浏览量
2008-03-27
12:53:48
上传
评论
收藏 22KB RAR 举报
温馨提示
图像算法的核心程序图像算法的核心程序
资源推荐
资源详情
资源评论
收起资源包目录
图像算法的核心程序.rar (19个子文件)
图像算法的核心程序
图像转置.txt 2KB
阈值变换.txt 953B
图像旋转.txt 4KB
显示浮雕文字效果.txt 4KB
显示渐变色彩效果.txt 3KB
维纳滤波处理.txt 3KB
拉普拉斯高斯边缘检测.txt 4KB
灰度均衡.txt 1KB
图像的3D灰度显示.txt 2KB
图像增强技术.txt 2KB
雕刻技术.txt 1KB
灰度拉伸.txt 2KB
Hough变换.txt 3KB
图像平移.txt 2KB
图像镜像.txt 3KB
逆滤波处理.txt 3KB
图像缩放.txt 3KB
图像的反色.txt 1KB
浮雕技术.txt 1KB
共 19 条
- 1
资源评论
Rojo.Cai
- 粉丝: 19
- 资源: 37
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功