请大家看一下这段程序,帮我改一下,谢谢(100分)

  • 主题发起人 主题发起人 amartapple
  • 开始时间 开始时间
A

amartapple

Unregistered / Unconfirmed
GUEST, unregistred user!
procedure TForm1.Button1Click(Sender: TObject);
var
tempBitmap:TBitmap;
i,j:integer;

RP,GP:real;
begin
tempBitmap:=TBitmap.Create;

FileName:='test.bmp';

try
begin
tempBitmap.LoadFromFile(FileName);

image1.Picture.LoadFromFile(FileName);

ProgressBar1.Max:=tempBitmap.Height*tempBitmap.Width;
ProgressBar1.Visible:=true;

for i:=0 to tempBitmap.Height-1 do
begin
pRGB := tempBitmap.ScanLine;

for j:=0 to tempBitmap.Width-1 do
begin
RP:=Get_r(pRGB^.rgbtRed,pRGB^.rgbtGreen,pRGB^.rgbtBlue);
GP:=Get_g(pRGB^.rgbtRed,pRGB^.rgbtGreen,pRGB^.rgbtBlue);

{
如果去掉这一句,速度会提高几十倍,可是这句实现的功能是本程
序核心,请大家帮忙优化一下这句的功能就是按比例换算RP,GP,
并使rg(TImage)上对应的点(RP,GP)变红,详见底下函数DrawPix
}
DrawPix(rg,RP,GP);

ProgressBar1.Position:=i*tempBitmap.Width+j;
application.ProcessMessages;

Inc(pRGB);
end

end;

ProgressBar1.Visible:=false;
end;
finally
tempBitmap.Free;
end;
end;

procedure TForm1.DrawPix(Des:TImage;X:real;Y:real);
begin
X:=50*X/0.2;
Y:=50*Y/0.2;
Des.Canvas.Pixels[trunc(X),trunc(Y)]:=clRed;
end;

end.
 
x/0.2=5*x
不是吗?
 
干吗要
X:=50*X/0.2;
Y:=50*Y/0.2;
直接
X:=250*X;
Y:=250*Y;
不行吗
 
谢谢大家,很有道理,我改了,速度有所提高
但是画点还是很慢,是不是pixels[]:=clred本身效率问题,不知道有没有别的方法

谢谢
 
对你有些帮助
http://bluemoon.myrice.com/efg/scanline.htm
 
1、不要做过程,直接写在里面
2、不要做这句>Des.Canvas.Pixels[trunc(X),trunc(Y)]:=clRed;
改成直接用扫描线
在前面写pRG:=rg.scanline[0]
x,y用整型,可以不用trunc()调用
写入时直接用扫描线数组操作

还有,乘250可以用左移8位减5来做,这样快一点
 
不用用PIXELS[]这个东西啦,这个是有BUG的
 
后退
顶部