📄 cpp3.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 + -