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