Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi bmp->graustufen mit canvas (https://www.delphipraxis.net/51786-bmp-graustufen-mit-canvas.html)

XeRo 18. Aug 2005 18:53


bmp->graustufen mit canvas
 
hi...ich möchte in einem TImage ein bild in graustufen umwandeln...hab leider trotz viel herumgetüftel nur schwarz weiß zusammengrbracht...

SirThornberry 18. Aug 2005 18:55

Re: bmp->graustufen mit canvas
 
hier gibts die Lösung: http://www.dsdt.info/tipps/?id=648

alzaimar 18. Aug 2005 18:57

Re: bmp->graustufen mit canvas
 
RGB-Farbe in Grauwert umrechnen (sinngemäß):
Delphi-Quellcode:
V := (Red + Green + Blue) div 3;
Pixel.Red := v;
Pixel.Green := v;
Pixel.Blue := v;
Allerdings ist das farbpsüscholojisch nicht absolut korrekt. Aber mir hat das bisher gereicht.

XeRo 18. Aug 2005 18:59

Re: bmp->graustufen mit canvas
 
das ging mal wieder sehr schnell


wenn wir schon dabei sind...gibts für den sepia effekt oder wie der heißt auch so eine einfache lösung?

alzaimar 18. Aug 2005 19:47

Re: bmp->graustufen mit canvas
 
Bestimmt, der Sepia-Effekt ist ja nichts anderes als eine Sw-Darstellung mit einem 'Touch' von Braun.
Einfach mal mit RGB spielen: Mach Dir doch drei Scrollbars für R,G und B und schau mal, wie so ein Bitmap sich verhält.

BlackJack 18. Aug 2005 21:04

Re: bmp->graustufen mit canvas
 
ich benutze immer diese Formel:
Code:
SW = R * 0.297 + G * 0.589 + B * 0.114;

XeRo 19. Aug 2005 08:32

Re: bmp->graustufen mit canvas
 
Zitat:

Zitat von alzaimar
Einfach mal mit RGB spielen: Mach Dir doch drei Scrollbars für R,G und B und schau mal, wie so ein Bitmap sich verhält.

Gute idee...
naja...Danke an alle...hat mir sehr geholfen...funktioniert alles super ;-)

SirThornberry 21. Aug 2005 11:09

Re: bmp->graustufen mit canvas
 
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

XeRo 21. Aug 2005 17:07

Re: bmp->graustufen mit canvas
 
Ok...vielen Dank...werds gleich mal ausprobieren...hab selber ein bisschen herumprobiert, bei mir ist aber nix dabei rauskommen... :wink:


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:21 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz