AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi bmp->graustufen mit canvas
Thema durchsuchen
Ansicht
Themen-Optionen

bmp->graustufen mit canvas

Ein Thema von XeRo · begonnen am 18. Aug 2005 · letzter Beitrag vom 21. Aug 2005
Antwort Antwort
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

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

Re: bmp->graustufen mit canvas

  Alt 21. Aug 2005, 11: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
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:49 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz