⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cpp3.cpp

📁 图像旋转程序
💻 CPP
字号:

#include<stdio.h>
#include<math.h>

void main()
{
	int i=0,j=0,t=255,i0,j0,angle,width,height;
	double angle1,a,i1,j1,width1,height1,t1,t2,x,y,x1,x2,x3,y1,y2,y3,f1,f2,f3,f4;
	
	unsigned int p[256][256],value1,value2,value3;
	FILE *cp;
	
	if((cp=fopen("lena.raw","rb"))==NULL)
		printf("file can not be opened.");
	else{
		
		for(i=0;i<=255;i++){
			for(j=0;j<=255;j++){
			fread(&p[i][j],1,1,cp);
			}
		}
		fclose(cp);                              //读取原图像每一个像素的灰度值,并用一个二维数组存储
	}
	printf("---------------------------线性旋转------------------------------\n");

	
	printf("enter the value of angle :\n");
	printf("angle=");
	scanf("%d",&angle);                                     	//输入任意的角度旋转值angle
	angle1=(double)angle*3.1415927/180;	
	a=45*3.1415927/180;
	
	x1=(-256)*sin(angle1);
	y1=256*cos(angle1);
	x2=256*sqrt(2)*cos(angle1+a);
	y2=256*sqrt(2)*sin(angle1+a);
	x3=256*cos(angle1);
	y3=256*sin(angle1);
	
	x=x1<=x2?x1:x2;
	x=x<=x3?x:x3;
	x=x<=0?x:0;
	
	y=x1<=y2?y1:y2;
	y=y<=y3?y:y3;
	y=y<=0?y:0;
	
	
	f1=x2>0?x2:(-x2);
	f2=(x3-x1)>0?(x3-x1):(x1-x3);
	f3=y2>0?y2:(-y2);
	f4=(y3-y1)>0?(y3-y1):(y1-y3);
	height1=f3>f4?f3:f4;                                        
	width1=f1>=f2?f1:f2;                                       	
	
	height=(int)(height1+0.5);                                       //求出旋转后的图宽width
	width=(int)(width1+0.5);                                       //求出旋转后的图高height
	
	
	if((cp=fopen("rotate.raw","wb"))==NULL)
		printf("can not open.\n");                        //保存 raw文件      
	else{
		for(i=0;i<height;i++)
		{
			for(j=0;j<width;j++)
			{
				
				j1=((double)j-(-x))*cos(angle1)+((double)i-(-y))*sin(angle1);
				i1=-((double)j-(-x))*sin(angle1)+((double)i-(-y))*cos(angle1);
				
				j0=(int)j1;
				i0=(int)i1;
				
				t1=j1-(double)j0;
				t2=i1-(double)i0;
			
				if((j0<0)||(j0>=256)||(i0<0)||(i0>=256))
					fwrite(&t,1,1,cp);
				else{
					if(j0<=254)
						
						value2=p[i0][j0]*(1-t1)+p[i0][j0+1]*t1;        //线性插值得到x方向的值value2
					else
						value2=p[i0][j0]*(1-t1);
					if(i0<=254)
						
						value3=p[i0][j0]*(1-t2)+p[i0+1][j0]*t2;
					else
						value3=p[i0][j0]*(1-t2);
					if(t1+t2!=0)
						
						value1=value2*(t2/(t1+t2))+value3*(t1/(t1+t2));   //在用两点差值法得到(j,i)的灰度值value1
					else
						value1=(value2+value3)/2;
					fwrite(&value1,1,1,cp);
				}
			}
		}
		fclose(cp);
	}
	printf("\n文件已输出至rotate.raw\n");
	
	return ;

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -