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;