ich hab bisschen mit dem Sephia rum probiert und hatte dort anfänglich das problem das ja ein reines weiß nicht mit rot vermischt wird. Irgnedwann kam dann die Idee das der Graustufenwert ja das Mischverhältnis mit dem Braunwert angeben könnte und ein zweiter wert das maximale Gegenteil festlegt.. Wäre nett wenn ihr mal probieren könntet ob die Funktion den Sephia-effekt hinbekommt. Wenn dem nicht so ist wäre eine genaue Fehlerbeschreibung ganz nett - also ungefähr: es ist zu rot - oder: ein reines weiß dürfte nicht so sehr eingefärbt werden etc.
Nicht vergessen die
Unit "math" einzubinden.
Delphi-Quellcode:
procedure RGBToSephia(ASource: TGraphic; ADest: TBitmap);
var LBitmap: TBitmap;
LCountY, LCountX: Integer;
LPixS, LPixD: PRGBTriple;
LByte, LIntensity1, LIntensity: Byte;
LBlendColor: TRGBTriple;
begin
LIntensity1 := 190;
LBlendColor.rgbtBlue := 0;
LBlendColor.rgbtGreen := 64;
LBlendColor.rgbtRed := 128;
LBitmap := TBitmap.Create;
LBitmap.Assign(ASource);
LBitmap.PixelFormat := pf24bit;
ADest.Width := LBitmap.Width;
ADest.Height := LBitmap.Height;
ADest.PixelFormat := pf24bit;
for LCountY := 0 to LBitmap.Height - 1 do
begin
LPixS := LBitmap.ScanLine[LCountY];
LPixD := ADest.ScanLine[LCountY];
for LCountX := 0 to LBitmap.Width - 1 do
begin
LByte := Trunc(LPixS.rgbtBlue*0.11+LPixS.rgbtGreen*0.59+LPixS.rgbtRed*0.3);
FillChar(LPixD^, 3, LByte);
LIntensity := Max(LIntensity1, LByte);
LPixD^.rgbtRed := Round((LPixD^.rgbtRed * LIntensity + LBlendColor.rgbtRed * not(LIntensity)) / 255);
LPixD^.rgbtGreen := Round((LPixD^.rgbtGreen * LIntensity + LBlendColor.rgbtGreen * not(LIntensity)) / 255);
LPixD^.rgbtBlue := Round((LPixD^.rgbtBlue * LIntensity + LBlendColor.rgbtBlue * not(LIntensity)) / 255);
inc(LPixD);
inc(LPixS);
end;
end;
LBitmap.Free;
end;
Wenn man LIntensity1 auf 255 setzt hat man auch einen relativ schnellen Graustufen-Algo