Переписал, оказывается не все так сложно как показалось
Не уверен что код оптимизирован, однако GetTickCount возвращает "15" для bmp 640*480 24bpp, SkyLine не далеко ушел - "16", что не может не радовать. Кстати, фильтр интересный довольно-таки, что-то вроде монохромного дизеринга. Код под FastDib:
Код:
procedure Mono(Bmp:TFastDIB;Split:Integer);
var
x,y,k: Integer;
Lin1: PLine24;
pc: PFColor;
begin
for y:=0 to Bmp.AbsHeight-1 do
begin
Lin1:=Bmp.Scanlines[y];
for x:=0 to Bmp.Width-1 do
begin
k:=(76*Lin1[x].r+150*lin1[x].g+30*lin1[x].b) div 256;
if k < Split then k:=0 else k:=255;
Lin1[x].r:=k;
Lin1[x].g:=k;
Lin1[x].b:=k;
end;
end;
end;