Thema: Delphi Helligkeit eines Bildes

Einzelnen Beitrag anzeigen

Merowinger

Registriert seit: 7. Jul 2005
13 Beiträge
 
Delphi 7 Enterprise
 
#1

Helligkeit eines Bildes

  Alt 13. Mär 2006, 18:58
Hey DPler,

ich habe hier zwei procduren die die Helligkeit von einem Bild ändern. Die erste Funktioniert (habe ich auch aus einem Buch geklaut). Den Quelltext an sich, was da passiert und wie man da von einem Bild die Helligkeit ändert, habe ich verstanden.

Delphi-Quellcode:

//Walter Doberenz, Thomas Kowalski Borland Delphi 7 Hanser Verlag
procedure Helligkeit(Bitmap, // Zielbitmap
                       Original : TBitmap; // Original
                       Value : integer); // Wert zw -240 ... + 240
var x,y : integer;
    Ziel : ^TRGBTriple;
    Quelle : ^TRGBTriple;
    n : byte;
    ar : array[0..255] of byte;
begin

  n := abs(value);
  if value > 0 then
    for x := 0 to 255 do if integer(x + n) > 255 then ar[x] := 255 else ar[x] := x + n
  else
    for x := 0 to 255 do if integer(x - n) < 0 then ar[x] := 0 else ar[x] := x - n;

  for y := 0 to Bitmap.Height-1 do begin
     Ziel := Bitmap.Scanline[y];
     Quelle := Original.Scanline[y];
     for x := 0 to (Bitmap.Width-1) do begin
       Ziel^.rgbtBlue := ar[Quelle^.rgbtBlue];
       Ziel^.rgbtred := ar[Quelle^.rgbtred];
       Ziel^.rgbtGreen := ar[Quelle^.rgbtGreen];
       inc(Ziel);
       inc(quelle);
     end;
  end;
end;

//Der Aufruf:

procedure TMainForm.Button1Click(Sender: TObject);
begin
   image.Picture.bitmap.PixelFormat := pf24bit;
   Helligkeit(image.picture.bitmap,image.picture.bitmap,StrToInt(EFaktor.Text));
   image.repaint
end;
Hier ist meine Quelltext:

Delphi-Quellcode:

procedure HelligkeitTest(Bild : TBitmap; Faktor : Smallint);
var x, y : integer;
    Zeile : ^TRGBTriple;

begin
     for y := 0 to Bild.Height - 1 do begin
         Zeile := Bild.ScanLine[y];
         for x := 0 to Bild.Width - 1 do begin
             case Zeile^.rgbtRed + Faktor of
             -255..-1 : Zeile^.rgbtRed := 0;
             0..255 : Zeile^.rgbtRed := Zeile^.rgbtRed + Faktor;
             256..500 : Zeile^.rgbtRed := 255;
             end;
             case Zeile^.rgbtGreen + Faktor of
             -255..-1 : Zeile^.rgbtGreen := 0;
             0..255 : Zeile^.rgbtGreen := Zeile^.rgbtGreen + Faktor;
             256..500 : Zeile^.rgbtGreen := 255;
             end;
             case Zeile^.rgbtBlue + Faktor of
             -255..-1 : Zeile^.rgbtBlue := 0;
             0..255 : Zeile^.rgbtBlue := Zeile^.rgbtBlue + Faktor;
             256..500 : Zeile^.rgbtBlue := 255;
             end;
             Inc(Zeile);
         end;
     end;
     Bild.Assign(Bild);
end;

//Der Aufruf:

procedure TMainForm.BtnHelligkeitClick(Sender: TObject);
begin
      Image.Picture.Bitmap.PixelFormat := pf24bit;
      HelligkeitTest(Image.Picture.Bitmap,StrToInt(EFaktor.Text));
end;
Ich helle um Faktor 50 auf und gleich wieder ab. Das Bild speichere ich und vergleiche es mit dem Ausgangsbild und es stimmt nicht über ein. Woran liegt das? Ich verstehe nicht warum in der ersten Methode "2" Bilder verwendet werden. Aus einem wird gelesen und in das andere geschrieben. Warum?

Danke Merowinger
  Mit Zitat antworten Zitat