Einzelnen Beitrag anzeigen

Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#8

Re: bmp->graustufen mit canvas

  Alt 21. Aug 2005, 12:09
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
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat