Hi,
dein Problem ist (glaube ich) dass du die Funktionsweise von Scanline nicht richtig verstanden hast.
Eine Scanline ist einfach nur ein Zeiger auf das erste Byte der rohen Daten. Anders gesagt, du hast einfach den Zeiger auf ein Byte, Delphi weiß nicht was für eine Struktur du an dieser Stelle erwartest. Das ermöglicht dir einfach die max. Flexibilität. Du kannst hier eine beliebige Umwandlung vornehmen.
In deinem Fall wandelst du in ein PColor32Array. Das ist ein Zeiger auf eine Color32Array. Anders gesagt, du hast ein Array von TColor32 Werten. Ein TColor32 besteht aus 4 Byte. Die Kodierung findest du in der
OH von der Graphics32.
Du musst jetzt für alle Kanäle (Alpha, Rot, Grün, Blau) die Helligkeit senken. Ein TColor 32 fässt diese 4 Byte zu einem 32 Bit Wert zusammen. Du musst also Byteweise ändern. Das kannst du mit einer entsprechenden Maske machen oder halt (transparenter) Byte weise.
Delphi-Quellcode:
procedure dunkler(Bitmap: TBitmap32;
const dp: Byte = 10);
var
PixelLine: pColor32array;
//hier gibts problmeme, weiss nicht welchen typ ich hier angeben muss
x, y: integer;
begin
for y := 0
to Bitmap.height - 1
do
begin
PixelLine := Bitmap.ScanLine[y];
for x := 0
to (Bitmap.width) - 1
do
// für die drei Farbkanäle sähe das so aus:
PixelLine[x].Red := PixelLine[x].Red - round(PixelLine^[x].Red /
dp);
PixelLine[x].Green := PixelLine[x].Green - round(PixelLine^[x].Green /
dp);
PixelLine[x].Blue := PixelLine[x].Blue - round(PixelLine^[x].Blue /
dp);
end;
end;
Gruß Der Unwissende