📄 xzhxian.cpp
字号:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "readwrite.h"
//原图象的宽度和高度
#define WIDTH 256
#define HEIGHT 256
bool xzhxian(unsigned char readData[HEIGHT][WIDTH], float angle); //函数定义
void main()
{
int choose;
float angle;
unsigned char readData[HEIGHT][WIDTH];//数据存储数组
ReadFile(&readData[0][0], WIDTH * HEIGHT, "lena.raw");//读入数据
printf("本程序用线性插值的方法完成图像的旋转功能。\n");
loop:
printf("请选择:\n");
printf("1--旋转;\n2--退出.\n");
scanf("%d",&choose);
switch (choose)
{
case 1:
printf("请输入旋转角度(正值顺时针旋转,负值逆时针旋转): \t");
scanf("%f", &angle);
xzhxian(readData,angle);
break;
case 2:
exit(0);
default:
printf("无效的选择!\n请重新选择!\n\n");
}
goto loop;
}
//旋转函数,角度为正就顺时针旋转,角度为负时逆时针旋转
bool xzhxian(unsigned char readData[HEIGHT][WIDTH], float angle)
{
int gx,gy;
float xc,yc;
float dx,dx1,dy,dy1;
float xx,yy,zz;
float gray;
int x1,x2,y1,y2;
float xt,yt;
long int i=0;
const float pai = (float)3.1415926;
float radAngle = angle * pai / 180; //将角度转换为弧度
int width = (int)(WIDTH * fabs(cos(radAngle)) + HEIGHT * fabs(sin(radAngle)));//计算新图象宽度(fabs函数计算浮点数的绝对值)
int height = (int)(WIDTH * fabs(sin(radAngle)) + HEIGHT * fabs(cos(radAngle)));//计算新图象高度
unsigned char *writeData = (unsigned char *)malloc(width * height * sizeof(unsigned char));
xc=(float)width/2; //旋转中心设定于图像的中心
yc=(float)height/2;
for(gy=0;gy<=height-1;gy++)
{
for(gx=0;gx<=width-1;gx++)
{
yt=gy-yc; //将旋转中心作为原点
xt=gx-xc;
//求对应于旋转后的图像网格点(xt,yt)的原图像点(xx,yy)
xx=(float)(xt*cos(radAngle)+yt*sin(radAngle))+WIDTH/2;
yy=(float)(-xt*sin(radAngle)+yt*cos(radAngle))+HEIGHT/2;
if(xx<0||xx>WIDTH||yy<0||yy>HEIGHT)
gray=255;
else{
y1=(int)yy; y2=y1+1;
x1=(int)xx; x2=x1+1;
dx=(float)(xx-x1); dx1=1.0-dx;
dy=(float)(yy-y1); dy1=1.0-dy;
zz=(float)readData[y1][x1]*dx1*dy1+(float)readData[y1][x2]*dx*dy1+(float)readData[y2][x1]*dx1*dy+(float)readData[y2][x2]*dx*dy;
gray=zz+0.5;
}
writeData[i] =(char)(int)gray;
i++;
}
}
WriteFile(writeData, width * height, "旋转结果(线性).raw");//将旋转后的图象输出到文件中
return true;
}
bool ReadFile(unsigned char *readData, int length, char *fileName) //读取数据函数
{
FILE *readPtr;
if ( (readPtr = fopen( fileName, "rb" )) == NULL )
printf(" 文件'%s' 无法打开!\n",fileName);
fread(readData, sizeof(unsigned char), length, readPtr);
fclose(readPtr);
return true;
}
bool WriteFile(unsigned char *writeData, int length, char *fileName) //输出数据函数
{
FILE *writePtr;
if ( (writePtr = fopen(fileName,"wb+")) == NULL)
printf(" 文件'%s' 无法写入!\n", fileName);
fwrite(writeData, sizeof(unsigned char), length, writePtr);
fclose(writePtr);
printf("旋转后的结果已保存至文件'%s'中 !\n\n",fileName);
return true;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -