Dein Code ist vollkommen richtig, du solltest nur die Bereichsprüfung ausschalten (am besten nur lokal per Compilerswitch).
Aber dein zweiter Code ist ziemlich ineffektiv, diesen solltest du als erstes verbessern, bevor du Pixel durch Bits ersetzt.
Delphi-Quellcode:
for i := 0 to Width * Height - 1 do
begin
B := (Bits[i] and $FF + $FF) shr 1;
Bits[i] := Bits[i] and $FFFFFF00 or B;
end;