Keine Ahnung, was du bisher hast, aber zum Auslesen der Bildinformationen kannst du
IDirect3DSurface9::LockRect verwenden. Dann schreibst du den Wert aus LockedRect.Bits komplett in den Stream (Gröse = Surface.Width * Surface.Height * BytesPerPixel). Bei ARGB (oder jedem anderen "4 Byte per Pixel" Format) musst du den zum padden verwendeten Pitch Wert nicht beachten.
Um jetzt an die einzelnen Pixel zu kommen, berechnest du erstmal die Position des Pixels:
Stream.Position := (YPos * Surface.Width + XPos) * 4;
Danach liest du ein komplettes DWord aus:
Stream.ReadBuffer(Pixel, 4);
Und schließlich decodierst du den Pixel folgendermaßen über eine simple Bitmaske:
Delphi-Quellcode:
procedure COLOR_DECODE_ARGB(Color: DWord; var A, R, G, B: Byte); inline;
begin
A := (Color and $FF000000) shr 24;
R := (Color and $00FF0000) shr 16;
G := (Color and $0000FF00) shr 8;
B := (Color and $000000FF);
end;