Scanline プロパティが遅いのは、GDIFlush API を呼び出したりと
いろいろコストがかかる処理しているからだね。

俺は ScanLine から次のラインへのオフセットを計算して
以後それを使って高速化している。

var
 ScanLinePtr0: Pointer;
 ScanLineOffset: Longint;
 Y: Longint;
 P: Pointer;
begin
 { 画像の任意のラインのポインタを計算するための準備 }
 ScanLinePtr0 := Bitmap.ScanLine[0];
 if Bitmap.Height>1 then
  ScanLineOffset := Integer(Bitmap.ScanLine[1])-Integer(Bitmap.ScanLine[0])
 else
  ScanLineOffset := 0;

{ 各ラインのポインタを求める }
 for Y:=0 to Bitmap.Height-1 do
 begin
  P := Pointer(Integer(ScanLinePtr0)+ScanLineOffset*Y);
  // 取得したポインタPを使ってとりあえず何かしよう
 end;
end;