//下面的函数的用双线性插值的方法对bmp图片进行缩放 , delphi2007中测试通过,联系作者:ijong@qq.com
procedure ScaleBitmap(Src,Dest:tbitmap) ;
{双线性内插值:
对于一个目的像素,设置坐标通过反向变换得到的浮点坐标为(i+u,j+v),
其中i、j均为非负整数,u、v为[0,1)区间的浮点数,则这个像素得值 f(i+u,j+v)
可由原图像中坐标为 (i,j)、(i+1,j)、(i,j+1)、(i+1,j+1)所对应的周围四个像素的值决定,即:
f(i+u,j+v) = (1-u)(1-v)f(i,j) + (1-u)vf(i,j+1) + u(1-v)f(i+1,j) + uvf(i+1,j+1)
其中f(i,j)表示源图像(i,j)处的的像素值,以此类推
这就是双线性内插值法。双线性内插值法计算量大,但缩放后图像质量高,不会出现像素值不连续的的情况。由于双线性插值具有低通滤波器的性质,使高频分量受损,所以可能会使图像轮廓在一定程度上变得模糊
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/ijong/archive/2010/06/16/5673593.aspx }
var
aRGB,aRGB_00,aRGB_01,aRGB_10,aRGB_11 :cardinal ;//四个参考像素的RGB值
R,R_00,R_01,R_10,R_11 ,
G,G_00,G_01,G_10,G_11 ,
B,B_00,B_01,B_10,B_11 : BYTE ; //参考像素的分量值颜色分量
u,v :double ; //偏移量
SrcI,SrcJ,DestI,DestJ : integer ; //循环变量
//Exp : extended ; // 定义一个值,当象素坐标相差小于改值时认为坐标相同
begin
//exp := 0.0001 ;
for destI := 0 to dest.Width - 1 do
for destJ := 0 to dest.Height - 1 do
begin
//计算坐标
srcI := trunc( destI * ( src.Width - 1 ) / (dest.Width-1) ) ;
u := destI * ( src.Width - 1 ) / (dest.Width-1) - srcI ; //上式的小数部分
srcJ := trunc( destJ * ( src.Height - 1 ) / (dest.Height-1) ) ;
v := destJ * ( src.Height - 1 ) / (dest.Height-1) - srcJ ;//上式的小数部分
//颜色赋值
aRGB_00 := colortorgb( src.Canvas.Pixels[srcI ,srcJ ] ) ;
aRGB_01 := colortorgb( src.Canvas.Pixels[srcI ,srcJ+1 ] ) ;
aRGB_10 := colortorgb( src.Canvas.Pixels[srcI+1 ,srcJ ] ) ;
aRGB_11 := colortorgb( src.Canvas.Pixels[srcI+1 ,srcJ+1 ] ) ;
R_00 := getRvalue( aRGB_00 ) ;
R_01 := getRvalue( aRGB_01 ) ;
R_10 := getRvalue( aRGB_10 ) ;
R_11 := getRvalue( aRGB_11 ) ;
G_00 := getGvalue( aRGB_00 ) ;
G_01 := getGvalue( aRGB_01 ) ;
G_10 := getGvalue( aRGB_10 ) ;
G_11 := getGvalue( aRGB_11 ) ;
B_00 := getBvalue( aRGB_00 ) ;
B_01 := getBvalue( aRGB_01 ) ;
B_10 := getBvalue( aRGB_10 ) ;
B_11 := getBvalue( aRGB_11 ) ;
R := TRUNC( (1-u)*(1-v)*R_00 + (1-u)*v*R_01 + u*(1-v)*R_10 + u*v*R_11 ) ;
G := TRUNC( (1-u)*(1-v)*G_00 + (1-u)*v*G_01 + u*(1-v)*G_10 + u*v*G_11 ) ;
B := TRUNC( (1-u)*(1-v)*B_00 + (1-u)*v*B_01 + u*(1-v)*B_10 + u*v*B_11 ) ;
aRGB := rgb(r,g,b);
dest.Canvas.Pixels[destI,destJ] := aRGB ;
end;
end;
- 1
- 2
- 3
前往页