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[i];        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.

解决方案 »

  1.   

    既然你会用ScanLine函数,那么快速更新也是一个道理,数字运算处理完成后再画。
      

  2.   

    先确定图像色深,如24位色var
      PRGB: pRGBTriple;   PRGB := Des.Picture.Bitmap.ScanLine[Trunc(Y)];
      Inc(PRGB,Trunc(X));
      PRGB^.rgbtRed:=$FF;
      PRGB^.rgbtGreen:=0;
      PRGB^.rgbtBlue:=0;32位色换为PRGBQuad8为要求你熟习调色板,换为PByte处理1位,4位,16位(pf15bit和pf16bit)涉及到位运算简单的做法是全部转为pf32bit处理
      

  3.   

    我觉得主要的瓶颈在pixels[]:=clred
      

  4.   

    当然,GetPixel,SetPixel是两个超慢的API,除了取单点颜色,没人会在这种情况下用,所以改成上面那样,都知道用ScanLine配合指针操作,后面怎么就搞不定呢?代码不是帮你写出来了?还有什么问题?
      

  5.   

    to: ehom(?!) 不行呀,还是那么慢,你自己试试看
      

  6.   

    呵呵,原理上讲也是要快很多啊你哪理解错了?我怎么试?如果是试两种方法的处理速度差,那不用试,明确的告诉你快很多,一个利用API,一个是内存中的位图数据直接操作,绝对快很多!