//放大缩小函数的定义
bool sfsan(unsigned char readData[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);
sfsan(readData,width,height);
break;
case 2:
exit(0);
default:
printf("无效的选择!\n请重新选择!\n\n");
}
goto loop;
}
//利用三次插值法完成的图像放大缩小函数
bool sfsan(unsigned char readData[HEIGHT][WIDTH], int width, int height)
{
unsigned char *writeData = (unsigned char *)malloc(width * height * sizeof(unsigned char));
long int i=0;
int gx,gy;
int k,n;
int xdist,ydist;
float deltax,deltay;
float dx,dx2,dx3;
float dy,dy2,dy3;
float xx,yy,zz;
float gray;
int x1,x2,x3,x4;
int y1,y2,y3,y4;
int x[5],y[5];
float ck0,cl0;
//求插值时原图像的采样间隔
deltax=(float)(WIDTH-3)/width;
deltay=(float)(HEIGHT-3)/height;
for(gy=0;gy=1))
ck0=(float)(4.0-8.0*dy+5.0*dy2-dy3);
if(dy>=2)
ck0=0.0;
for(n=1;n=1))
cl0=(float)(4.0-8.0*dx+5.0*dx2-dx3);
if(dx>=2)
cl0=0.0;
if((y[k]>WIDTH)||(x[k]>HEIGHT))
continue;
zz=zz+(float)readData[y[k]][x[n]]*ck0*cl0;
}
}
gray=(float)zz+0.5;
//限制灰度的上限值为255,下限值为0
if(gray>255)
gray=255;
if(gray<0)
gray=0;
writeData = (char)(int)gray;
//求得的插值点灰度值存入数组writeData
i++;
}
}
|