图像旋转算法与实现_第1页
图像旋转算法与实现_第2页
图像旋转算法与实现_第3页
图像旋转算法与实现_第4页
图像旋转算法与实现_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、.好吧,先下个定义,图像旋转是指图像以某一点为中心旋转一定的角度,形成一幅新的图像的过程。当然这个点通常就是图像的中心。既然是按照中 心旋转,自然会有这样一个属性:旋转前和旋转后的点离中心的位置不变根据这个属性,我们可以得到旋转后的点的坐标与原坐标的对应关系。由于原图像的坐标是以左上角为原点的,所以我们先把坐标转换为以图像中心为原点。假设原图像的宽为w,高为h, ( Xo,y 0)为原坐标内的一点,转换坐标后的点为(xi,yj。那么不难得到:xi = x 0 - w/2; y i = -y o + h/2;在新的坐标系下,假设点(xo,y 0)距离原点的距离为r,点与原点之间的连 线与x轴的夹

2、角为b,旋转的角度为a,旋转后的点为(xi,yi),如下图所 示。那么有以下结论:Xo=rcosb ; yo=rsinb0cosa+y 0sina ;x1 = rcos(b-a) = rcosbcosa+rsinbsina=xy1=rsin(b-a)=rsinbcosa-rcosbsina=-x0sina+y 0cosa ;得到了转换后的坐标 , 我们只需要把这些坐标再转换为原坐标系即可。这 里还有一点要注意 , 旋转后的图像的长和宽会发生变化 , 因此要计算新图 像的长和宽。以下为源程序:1 #include "stdafx.h"2 #include <stdio.

3、h>3 #include <string>4 #include <math.h>5 #include <windows.h>6 using namespace std;78 #define PI 3/ 角度到弧度转化10 #define RADIAN(angle) (angle)*PI/180.0)1112 void Rotation(const string& srcFile,const string& desFile,int angle)13 14 BITMAPFILEHEADER bmfHeader;15

4、 BITMAPINFOHEADER bmiHeader;1617 FILE *pFile;18 if (pFile = fopen(srcFile.cstr(),"rb") = NULL)19 20 printf("open bmp file error.");21 exit(-1);22 23 / 读取文件和 Bitmap 头信息24 fseek(pFile,0,SEEKSET);25 fread(&bmfHeader,sizeof(BITMAPFILEHEADER),1,pFile);26 fread(&bmiHeader,sizeo

5、f(BITMAPINFOHEADER),1,pFile);27 / 先不支持小于 16 位的位图28 int bitCount = bmiHeader.biBitCount;29 if (bitCount < 16)30 31 exit(-1);32 33 int srcW = bmiHeader.biWidth;34 int srcH = bmiHeader.biHeight;35 /原图像每一行去除偏移量的字节数36 int lineSize = bitCount * srcW / 8;37 /偏移量 ,windows 系统要求每个扫描行按四字节对齐38 int alignBytes

6、 = (bmiHeader.biWidth * bitCount + 31) & 31) /8L39 - bmiHeader.biWidth * bitCount / 8L;40 / 原图像缓存41 int srcBufSize = lineSize * srcH;42 BYTE* srcBuf = new BYTEsrcBufSize;43 int i,j;44 / 读取文件中数据45 for (i = 0; i < srcH; i+)46 47 fread(&srcBuflineSize * i,lineSize,1,pFile);48 fseek(pFile,ali

7、gnBytes,SEEKCUR);49 50 / 以图像中心为原点左上角 , 右上角 , 左下角和右下角的坐标 , 用于计算 旋转后的图像的宽和高51 POINT pLT,pRT,pLB,pRB;52 pLT.x = -srcW/2;pLT.y = srcH/2;53 pRT.x = srcW/2;pRT.y = srcH/2;54 pLB.x = -srcW/2;pLB.y = -srcH/2;55 pRB.x = srcW/2; pRB.y = -srcH/2;56 / 旋转之后的坐标57 POINT pLTN,pRTN,pLBN,pRBN;58 double sina = sin(RAD

8、IAN(angle);59 double cosa = cos(RADIAN(angle);60 pLTN.x = pLT.x*cosa + pLT.y*sina;61 pLTN.y = -pLT.x*sina + pLT.y*cosa;62 pRTN.x = pRT.x*cosa + pRT.y*sina;63 pRTN.y = -pRT.x*sina + pRT.y*cosa;64 pLBN.x = pLB.x*cosa + pLB.y*sina;65 pLBN.y = -pLB.x*sina + pLB.y*cosa;66 pRBN.x = pRB.x*cosa + pRB.y*sina

9、;67 pRBN.y = -pRB.x*sina + pRB.y*cosa;68 / 旋转后图像宽和高69 int desWidth = max(abs(pRBN.x - pLTN.x),abs(pRTN.x - pLBN.x);70 int desHeight = max(abs(pRBN.y - pLTN.y),abs(pRTN.y - pLBN.y);71 / 分配旋转后图像的缓存72 int desBufSize = (desWidth * bitCount + 31) / 32) * 4 * desHeight;73 BYTE *desBuf = new BYTEdesBufSize

10、;74 / 将所有像素都预置为白色75 memset(desBuf,255,desBufSize);76 /新图像每一行字节数 , 带有偏移量77 int desLineSize = (desWidth * bitCount + 31) / 32) * 4;78 /通过新图像的坐标 , 计算对应的原图像的坐标79 for (i = 0; i < desHeight; i+)80 81 for (j = 0; j < desWidth; j+)82 83 / 转换到以图像为中心的坐标系 , 并进行逆旋转84 int tX = (j - desWidth / 2)*cos(RADIAN

11、(360 - angle) +(-i + desHeight / 2)*sin(RADIAN(360 - angle);85 int tY = -(j - desWidth / 2)*sin(RADIAN(360 - angle) +(-i + desHeight / 2)*cos(RADIAN(360 - angle);86 / 如果这个坐标不在原图像内 , 则不赋值87 if (tX > srcW / 2 | tX < -srcW / 2 | tY > srcH / 2 |tY < -srcH / 2)88 89 continue;90 91 /再转换到原坐标系下9

12、2 int tXN = tX + srcW / 2; int tYN = abs(tY - srcH / 2);93 /值拷贝94 memcpy(&desBufi * desLineSize + j * bitCount /8,&srcBuftYN * lineSize + tXN * bitCount / 8,3);95 96 9798 / 创建目标文件99 HFILE hfile = lcreat(desFile.cstr(),0);100 / 文件头信息101 BITMAPFILEHEADER nbmfHeader;102 nbmfHeader.bfType = 0x4D

13、42;103 nbmfHeader.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)104 + desWidth * desHeight * bitCount / 8;105 nbmfHeader.bfReserved1 = 0;106 nbmfHeader.bfReserved2 = 0;107 nbmfHeader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);108 /Bitmap 头信息BITMAPINFOHEADER bmi;109

14、 bmi.biSize=sizeof(BITMAPINFOHEADER);110 bmi.biWidth=desWidth;111 bmi.biHeight=desHeight;112 bmi.biPlanes=1;113 bmi.biBitCount=bitCount;114 bmi.biCompression=BIRGB;115 bmi.biSizeImage=0;116 bmi.biXPelsPerMeter=0;117 bmi.biYPelsPerMeter=0;118 bmi.biClrUsed=0;119 bmi.biClrImportant=0;121122 / 写入文件头信息1

15、23 lwrite(hfile,(LPCSTR)&nbmfHeader,sizeof(BITMAPFILEHEADER);124 / 写入 Bitmap 头信息125 lwrite(hfile,(LPCSTR)&bmi,sizeof(BITMAPINFOHEADER);126 / 写入图像数据127 lwrite(hfile,(LPCSTR)desBuf,desBufSize);128 lclose(hfile);129 130131 int main(int argc, char* argv)132 133 FILE *pFile;134 if (pFile = fopen("e:/t.bmp","rb") = NULL)135 136 printf(&

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论