Einzelnen Beitrag anzeigen

Eichhoernchen

Registriert seit: 22. Apr 2004
Ort: Hagen
322 Beiträge
 
Turbo Delphi für Win32
 
#1

Photoshopfilter: Dunkle Bereiche Vergrößern

  Alt 25. Jun 2006, 13:49
So, da ich diesen Filter brauchte habe ich ihn nachgecodet.

Er benötigt die RGBtoHSV und HSVtoRGB Funktionen aus: http://www.delphipraxis.net/internal...ct.php?t=24154

Beschreibung nach Photoshop:
Zitat:
"Dunkle Bereiche vergrößern" und "Helle Bereiche vergrößern" (Photoshop) Diese beiden Filter sind zum Ändern von Masken sehr nützlich. Der Filter "Dunkle Bereiche vergrößern" entspricht dem Anwenden einer Überfüllung - schwarze Bereiche werden ausgedehnt und weiße Bereiche verkleinert. Der Filter "Helle Bereiche vergrößern" entspricht dem Anwenden einer Unterfüllung - weiße Bereiche werden ausgedehnt und schwarze Bereiche verkleinert. Genau wie der Filter "Helligkeit interpolieren" werden die Filter "Dunkle Bereiche vergrößern" und "Helle Bereiche vergrößern" auf einzelne Pixel in einer Auswahl angewendet. Innerhalb eines angegebenen Radius ersetzen die Filter "Dunkle Bereiche vergrößern" und "Helle Bereiche vergrößern" den Helligkeitswert des aktuellen Pixels durch den höchsten oder niedrigsten Helligkeitswert der umgebenden Pixel.
Delphi-Quellcode:
function ExpandDarkAreas(bmp : TBitmap; const range : byte) : TBitmap;
var i, j, x, a, b, minimum, count : integer;
    angle : array of integer;
    saturation, brightness : array of byte;
    pixcolor : TColor;
Begin
 count := (range+range+1)*(range+range+1); //Anzahl der Pixel die untersucht werden
 //Arrays auf Länge setzen
 setlength(angle, count);
 setlength(saturation, count);
 setlength(brightness, count);
 //Funktionsergebnis vorbereiten
 result := TBitmap.Create;
 result.Width := bmp.Width;
 result.Height := bmp.Height;
 result.PixelFormat := bmp.PixelFormat;
 //Alle Pixel sollen durchlaufen werden
 for i := 0 to bmp.Width-1 do
  for j := 0 to bmp.Height-1 do
    Begin
     x := 0;
     for a := -range to range do
      for b := -range to range do
       Begin
        //HSV Werte in die Arrays speichern
        pixcolor := bmp.Canvas.Pixels[i+a, j+b];
        RGBtoHSV(GetRValue(pixcolor), GetGValue(pixcolor), GetBValue(pixcolor), angle[x], saturation[x], brightness[x]);
        inc(x);
       end;
     //Dunkelsten Wert suchen!
     minimum := brightness[0];
     for x := 1 to count-1 do
      minimum := Min(minimum, brightness[x]); //Für helle Bereiche vergrößern: statt Min=>Max
    //Dunkelsten Wert in neue Bitmap setzen.
     result.Canvas.Pixels[i, j] := HSVtoRGB(angle[(count div 2)+1], saturation[(count div 2)+1], minimum);
    end;
end;

Hmm der Code sollte eigentlich ausreichend Kommentiert sein.


Viel Spaß Eichhoernchen
Jan
  Mit Zitat antworten Zitat