![]() |
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...
|
Re: bmp->graustufen mit canvas
hier gibts die Lösung:
![]() |
Re: bmp->graustufen mit canvas
RGB-Farbe in Grauwert umrechnen (sinngemäß):
Delphi-Quellcode:
Allerdings ist das farbpsüscholojisch nicht absolut korrekt. Aber mir hat das bisher gereicht.
V := (Red + Green + Blue) div 3;
Pixel.Red := v; Pixel.Green := v; Pixel.Blue := v; |
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? |
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. |
Re: bmp->graustufen mit canvas
ich benutze immer diese Formel:
Code:
SW = R * 0.297 + G * 0.589 + B * 0.114;
|
Re: bmp->graustufen mit canvas
Zitat:
naja...Danke an alle...hat mir sehr geholfen...funktioniert alles super ;-) |
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:
Wenn man LIntensity1 auf 255 setzt hat man auch einen relativ schnellen Graustufen-Algo
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; |
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 07:41 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