毕设时的一个函数,再讨论
[email protected]
/*****************************************
卷积核心算法
*****************************************/
UINT CDib::interPolate(UINT *Src,int x,int y, float u,float v, int scanw, int scanh)
{
    UINT red[4][4];
UINT green[4][4];
UINT blue[4][4];
UINT r,g,b;
r=g=b=0; if(1)
{
int xx[4];
int yy[4]; xx[0]=x-1;
xx[1]=x;
xx[2]=x+1;
xx[3]=x+2; yy[0]=y-1;
yy[1]=y;
yy[2]=y+1;
yy[3]=y+2; if(xx[0]<0)
xx[0]=0;
if(yy[0]<0)
yy[0]=0; if(xx[2]>scanw-1)
xx[2]=scanw-1;
if(yy[2]>scanh-1)
yy[2]=scanh-1;
if(xx[3]>scanw-1)
xx[3]=scanw-1;
if(yy[3]>scanh-1)
yy[3]=scanh-1; int i=0;
int j=0; for(i=0;i<4;i++)
{
int indexBase = yy[i]*scanw;
for(j=0;j<4;j++)
{
int index = indexBase + xx[j];
red[i][j] = 0x000000ff&(Src[index]);
green[i][j] = 0x000000ff&(Src[index]>>8);
blue[i][j] = 0x000000ff&(Src[index]>>16);
}
} float su[4];
float sv[4];
su[0] = sinx_x(1.0f+u);
su[1] = sinx_x(u);
su[2] = sinx_x(1.0f-u);
su[3] = sinx_x(2.0f-u); sv[0] = sinx_x(1.0f+v);
sv[1] = sinx_x(v);
sv[2] = sinx_x(1.0f-v);
sv[3] = sinx_x(2.0f-v); float sv_r[4];
float sv_g[4];
float sv_b[4]; for(i=0;i<4;i++)
{
sv_r[i]=sv_g[i]=sv_b[i]=0.0;
for(j=0;j<4;j++)
{
sv_r[i]+=(sv[j]*red[j][i]);
sv_g[i]+=(sv[j]*green[j][i]);
sv_b[i]+=(sv[j]*blue[j][i]);
}
}
    float r1 = (su[0]*sv_r[0]+su[1]*sv_r[1]+su[2]*sv_r[2]+su[3]*sv_r[3]);
float r2 = (su[0]*sv_g[0]+su[1]*sv_g[1]+su[2]*sv_g[2]+su[3]*sv_g[3]);
    float r3 = (su[0]*sv_b[0]+su[1]*sv_b[1]+su[2]*sv_b[2]+su[3]*sv_b[3]); if((r1-(UINT)r1)>0.5f)
r=(UINT)r1+1;
else
r=(UINT)r1;
if((r2-(UINT)r2)>0.5f)
g=(UINT)r2+1;
else
g=(UINT)r2;
if((r3-(UINT)r3)>0.5f)
b=(UINT)r3+1;
else
b=(UINT)r3;
r = (r<0)?0:((r>255)?255:r);
g = (g<0)?0:((g>255)?255:g);
b = (b<0)?0:((b>255)?255:b); }
else if(1==0)
{
int red[2][2];
int green[2][2];
int blue[2][2];
int xx[2];
int yy[2];
xx[0]=x;xx[1]=x+1;
yy[0]=y;yy[1]=y+1;
if(xx[1]>scanw-1)
xx[1] = scanw-1;
if(yy[1]>scanh-1)
yy[1] = scanh-1; for(int i=0;i<2;i++)
{
int indexBase = yy[i]*scanw;
for(int j=0;j<2;j++)
{
int index = indexBase + xx[j];
red[j][i] = 0x000000ff&(Src[index]);
    green[j][i] = 0x000000ff&(Src[index]>>8);
    blue[j][i] = 0x000000ff&(Src[index]>>16); }
} r = (UINT)((1-u)*(1-v)*red[0][0]+(1-u)*v*red[0][1]+u*(1-v)*red[1][0]+u*v*red[1][1]);
g = (UINT)((1-u)*(1-v)*green[0][0]+(1-u)*v*green[0][1]+u*(1-v)*green[1][0]+u*v*green[1][1]);
b = (UINT)((1-u)*(1-v)*blue[0][0]+(1-u)*v*blue[0][1]+u*(1-v)*blue[1][0]+u*v*blue[1][1]);
    }
else
{

    int index = y*scanw+x;
r = 0x000000ff&(Src[index]);
g = 0x000000ff&(Src[index]>>8);
b = 0x000000ff&(Src[index]>>16);

} return (0x00ffffff&((b<<16)|(g<<8)|r));
}