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