Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Helligkeit eines Bildes (https://www.delphipraxis.net/65208-helligkeit-eines-bildes.html)

Merowinger 13. Mär 2006 18:58


Helligkeit eines Bildes
 
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

Flare 13. Mär 2006 19:05

Re: Helligkeit eines Bildes
 
Zitat:

Delphi-Quellcode:
case Zeile^.rgbtRed + Faktor of
  -255..-1 : Zeile^.rgbtRed := 0;
  0..255 : Zeile^.rgbtRed := Zeile^.rgbtRed + Faktor;
  256..500 : Zeile^.rgbtRed := 255;
end;

Ich weiß nicht ob das wichtig ist oder einfach übergangen wird, aber wenn du Zeile^.rgbtRed + Faktor berechnest und dann entsprechend veränderst, dann ist doch Zeile^.rgbtRed dann ein anderer Wert. Meine Vermutung ist, dass dieser geänderte Wert dann (mit unglücklichem Zufall) auch die dritte Case-Anweisung aufruft. Ich habe es elber nicht getestet, wäre vielleicht nicht schlecht wenn das jemand macht.


Flare

marabu 13. Mär 2006 19:18

Re: Helligkeit eines Bildes
 
Hallo Merowinger,

durch das Clipping der Helligkeitswerte an den Intervallgrenzen hast du keine umkehrbare Funktion mehr. Die beiden Bildparameter erlauben dir wahlweise das Überschreiben oder Beibehalten des Originals.

@Flare: nur ein Zweig der case Anweisung wird durchlaufen - Pascal ist nicht C.

Grüße vom marabu


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:10 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz