Thema: Delphi GR32 bilder verdunkeln

Einzelnen Beitrag anzeigen

Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#5

Re: GR32 bilder verdunkeln

  Alt 27. Aug 2006, 15:41
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
  Mit Zitat antworten Zitat