AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Helligkeit eines Bildes
Thema durchsuchen
Ansicht
Themen-Optionen

Helligkeit eines Bildes

Ein Thema von Merowinger · begonnen am 13. Mär 2006 · letzter Beitrag vom 13. Mär 2006
Antwort Antwort
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
Flare

Registriert seit: 26. Jan 2006
Ort: Leipzig
529 Beiträge
 
Delphi 7 Professional
 
#2

Re: Helligkeit eines Bildes

  Alt 13. Mär 2006, 19:05
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
Willy Scheibel
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#3

Re: Helligkeit eines Bildes

  Alt 13. Mär 2006, 19:18
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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:12 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