一个图像缩放的简单算法:
BOOL MyBilinearScalingImage(char * pOriImg, int OriW, int OriH, char * pSrcImg, int SrcW,int SrcH)
{
//TODO: Add your source code here unsigned char pBits;
unsigned char *p0, *p1, *p2, *p3;
int k, SrcWByte, OriWByte, Wr, Hr, m, n;
float acc_a, acc_b, acc_a1, acc_b1, da, db;
float Value;
int Height, Width;
float old_acc_a, old_acc_b;
int p, q, old_p, old_q; pBits = 24/8;
Wr = SrcW / OriW;
Hr = SrcH / OriH;
da = (float)OriW / (float)SrcW;
db = (float)OriH / (float)SrcH; SrcWByte = WIDTHBYTES(24*SrcW);
OriWByte = WIDTHBYTES(24*OriW); // ShowPercent(0, 0, STAGE_SCALE_IMAGE);
Height = OriH; // - 1 ;
Width = OriW; // -1 ; // ShowPercent(0, 0, STAGE_SCALE_IMAGE); acc_b = 0; //db/2.0;
p = 0;
for (m = 0; m < Height; m++)
{
// if ( (m%5) == 0 ) ShowPercent((WORD)m, (WORD)OriH, 0);
acc_a = 0; //da/2.0;
q = 0;
for (n = 0; n < Width; n++)
{
p0 = pOriImg + m*OriWByte + n*pBits;
if(m==Height-1)
p2 = p0;
else
p2 = p0 + OriWByte;
if(n==Width-1)
{
p1 = p0;
p3 = p2;
}
else
{
p1 = p0 + pBits;
p3 = p2 + pBits;
} old_p = p;
old_acc_b = acc_b;
while(acc_b<1.0 && p<SrcH)
{
acc_b1 = 1.0-acc_b;
old_acc_a = acc_a;
old_q = q;
while(acc_a<1.0 && q<SrcW)
{
acc_a1 = 1.0-acc_a;
for (k=0; k<pBits; k++)
{
Value = *(p0+k)*acc_a1*acc_b1 +
*(p1+k)*acc_a*acc_b1 +
*(p2+k)*acc_a1*acc_b +
*(p3+k)*acc_a*acc_b ;
*(pSrcImg+p*SrcWByte+q*pBits+k) = (unsigned char)min((Value+0.5), 255);
}
acc_a += da;
q++;
}
acc_b += db;
p++;
if(acc_b<1.0) // || q>=SrcW)
{
q = old_q;
acc_a = old_acc_a;
}
}
if (acc_a >= 1.0)
acc_a -= 1.0;
if (q<SrcW)
{
p = old_p;
acc_b = old_acc_b;
}
else
{
if( acc_b >= 1.0 )
acc_b -= 1.0;
}
}
} return TRUE ;
}
BOOL MyBilinearScalingImage(char * pOriImg, int OriW, int OriH, char * pSrcImg, int SrcW,int SrcH)
{
//TODO: Add your source code here unsigned char pBits;
unsigned char *p0, *p1, *p2, *p3;
int k, SrcWByte, OriWByte, Wr, Hr, m, n;
float acc_a, acc_b, acc_a1, acc_b1, da, db;
float Value;
int Height, Width;
float old_acc_a, old_acc_b;
int p, q, old_p, old_q; pBits = 24/8;
Wr = SrcW / OriW;
Hr = SrcH / OriH;
da = (float)OriW / (float)SrcW;
db = (float)OriH / (float)SrcH; SrcWByte = WIDTHBYTES(24*SrcW);
OriWByte = WIDTHBYTES(24*OriW); // ShowPercent(0, 0, STAGE_SCALE_IMAGE);
Height = OriH; // - 1 ;
Width = OriW; // -1 ; // ShowPercent(0, 0, STAGE_SCALE_IMAGE); acc_b = 0; //db/2.0;
p = 0;
for (m = 0; m < Height; m++)
{
// if ( (m%5) == 0 ) ShowPercent((WORD)m, (WORD)OriH, 0);
acc_a = 0; //da/2.0;
q = 0;
for (n = 0; n < Width; n++)
{
p0 = pOriImg + m*OriWByte + n*pBits;
if(m==Height-1)
p2 = p0;
else
p2 = p0 + OriWByte;
if(n==Width-1)
{
p1 = p0;
p3 = p2;
}
else
{
p1 = p0 + pBits;
p3 = p2 + pBits;
} old_p = p;
old_acc_b = acc_b;
while(acc_b<1.0 && p<SrcH)
{
acc_b1 = 1.0-acc_b;
old_acc_a = acc_a;
old_q = q;
while(acc_a<1.0 && q<SrcW)
{
acc_a1 = 1.0-acc_a;
for (k=0; k<pBits; k++)
{
Value = *(p0+k)*acc_a1*acc_b1 +
*(p1+k)*acc_a*acc_b1 +
*(p2+k)*acc_a1*acc_b +
*(p3+k)*acc_a*acc_b ;
*(pSrcImg+p*SrcWByte+q*pBits+k) = (unsigned char)min((Value+0.5), 255);
}
acc_a += da;
q++;
}
acc_b += db;
p++;
if(acc_b<1.0) // || q>=SrcW)
{
q = old_q;
acc_a = old_acc_a;
}
}
if (acc_a >= 1.0)
acc_a -= 1.0;
if (q<SrcW)
{
p = old_p;
acc_b = old_acc_b;
}
else
{
if( acc_b >= 1.0 )
acc_b -= 1.0;
}
}
} return TRUE ;
}
Windows确实用过thumbvw.dll进行的,但外面对这方面的资料一点都没有。
微软根本就没有公开过。有一个控件Image Thumbnail control就实现了一
部分。可惜我还不太会用。并且它不支持html,ppt等Windows Explorer中
支持的东东。另外,我也不希望对每一种文件都作一个Plugin的DLL.希望
Windows一支持,我的程序也就自动支持了。比如,GetOpenFilename在
W2K中就同时支持这种风格。
在Windows2000的程序中调用GetOpenFilename之后,选择缩小化之后,会
创建一个"ThumbnailVwExtWnd32"的窗口,里面再创建一个ListView。我现在就
希望能像GetOpenFilename一样,自动和Explorer进行关联,Windows支持什么
咱们就同样支持什么。