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

📄 xzhxian.cpp

📁 图像旋转(线性插值法)
💻 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 + -