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

📄 sfxian.cpp

📁 图像缩放(线性插值法)
💻 CPP
字号:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "readwrite.h"

//原图象的宽度和高度
#define WIDTH 256
#define HEIGHT 256

//放大缩小函数定义
bool sfxian(unsigned char inputData[HEIGHT][WIDTH], int width, int height);

void main()
{
	int choose;
	int width,height;

	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("%d", &width);
			printf("请输入高度:\t");
			scanf("%d", &height);
			sfxian(readData,width,height);
			break;
		
		case 2:
			exit(0);
		default:
			printf("无效的选择!\n请重新选择!\n\n");  //错误输入提示
	}
	goto loop;
}

bool sfxian(unsigned char readData[HEIGHT][WIDTH], int width, int height)
{
    unsigned char *writeData = (unsigned char *)malloc(width * height * sizeof(unsigned char));

	int gx,gy;              //新图中的横纵坐标
	long int i=0;
	float deltax,deltay;    //从原图采样的间隔
	float dx,dx1,dy,dy1;
	float xx,yy,zz;
	float   gray;
	int   x1,x2,y1,y2;

//从原图读取数据时的采样间隔
	deltax=(float)WIDTH/width;
	deltay=(float)HEIGHT/height;

	for(gy=0;gy<=height-1;gy++)
	{
		for(gx=0;gx<=width-1;gx++)
		{
	
		yy=(float)(gy*deltay);    //yy为新图中的gy在原图中的纵坐标
		y1=(int)yy;               //yy的前后点y1,y2
		y2=y1+1;
		
	    xx=(float)(gx*deltax);	  //求采样点的x坐标xx
   	    x1=(int)xx;               //xx的前后点x1,x2
		x2=x1+1;

 //用线性插值法求非网格点位置(yy,xx)处的灰度值zz
		  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 + -