![]() |
Simple Grafikfunktionen
Liste der Anhänge anzeigen (Anzahl: 1)
Also ich schreib mir gerade ein paar simple Grafikfunktionen zusammen, wie zB ein einfacher Farbverlauf.
Jetzt möchte ich gerne eine InnerGlow Funktion, ähnlich der von Photoshop (natuerlich nicht so umfangreich) schreiben. Also sozusagen ein leuchtender, innerer Border. Hab mir das so gedacht, dass ich es ähnlich eines Farbverlaufs mache, und dabei die Farbe immer transparenter werden lasse (also der Farbe darunter immer näher kommen lasse). Weiss wer wie ich das machen kann? Hoffe ihr versteht was ich meine ich häng mal n Bildchen dran! MfG |
Re: Simple Grafikfunktionen
Du mußt dazu wohl pixelweise auf den Canvas malen.
|
Re: Simple Grafikfunktionen
Echt? Kann ich mir nich ne Funktion schreiben um nach und nach die Farben "verschmelzen" zu lassen?
|
Re: Simple Grafikfunktionen
Delphi bietet standardmäßig keine Bildverarbeitungsfunktionen. Vielleicht mit einer Fremdbibliothek.
|
Re: Simple Grafikfunktionen
Hallo,
das geht natürlich:
Delphi-Quellcode:
falls ich mich nicht irgendwo vertan hab, bekommst du damit auf einem linearen farbverlauf von ColStart nach ColEnd, der über die Länge Length geht, die Farbe an der Stelle Step.
function LinearGradientStep(ColStart, ColEnd: TColor; Length, Step: Integer): TColor;
var r1,r2,g1,g2,b1,b2,rr,gr,br,rd,bd,gd: Byte; //1,2,result,delta begin r1 := GetRValue(ColStart); g1 := GetGValue(ColStart); b1 := GetBValue(ColStart); r2 := GetRValue(ColEnd); g2 := GetGValue(ColEnd); b2 := GetBValue(ColEnd); rd := r2 - r1; gd := g2 - g1; bd := b2 - b1; rr := r1 + round(rd * step / length); gr := g1 + round(gd * step / length); br := b1 + round(bd * step / length); Result := RGB(rr,gr,br); end; Das musst du jetzt nur noch in eine Schleife einfügen, die über die gesamte länge iteriert und entsprechend zeichnet. |
Re: Simple Grafikfunktionen
Hmm..ich glaube da hast du falsch verstanden was ich möchte (oder ich deinen Code :D).
Also den Farbverlauf habe ich schon selbst hinbekommen, was ich suche ist sozusagen eine Möglichkeit, eine Farbe "transparent" zu malen. Dass das so in Delphi nicht direkt Möglich ist ist mir durchaus klar, aber es gibt doch sicherlich eine Mathematische Funktion oder so, die mir einen Farbwert gibt. An die Funktion gebe ich Farbe1 und Farbe2 und einen Transparenzwert. Daraus errechnet er mir die neue Farbe, wenn Farbe2 ueber Farbe1 liegt. Sowas muss ich natuerlich selbst schreiben und ist nich von Delphi vorgegeben, aber es gibt doch sicher einen Term dazu oder sowas? |
Re: Simple Grafikfunktionen
Geht über Ausmaskierung
|
Re: Simple Grafikfunktionen
Hallo, da gibt es die beiden Verfahren "Blending" und noch was anderes, wo mir jetzt der name nicht einfällt. Aber du kannst es natürlich wiederum linear machen:
Delphi-Quellcode:
So in etwa sollte das hinhauen. exakte formeln sollten sich über internet aber durchaus finden lassen, z.B. in der Wikipedia.
function LinearBlendedColor(CBack, CFront: TColor; alpha: Byte): TColor;
var r1,r2,g1,g2,b1,b2,rr,gr,br: Byte; //1,2,result begin r1 := GetRValue(CBack); g1 := GetGValue(CBack); b1 := GetBValue(CBack); r2 := GetRValue(CFront); g2 := GetGValue(CFront); b2 := GetBValue(CFront); rr := r1 * round(1- (alpha / 255)) + r2 * round(alpha / 255); gr := g1 * round(1- (alpha / 255)) + g2 * round(alpha / 255); br := b1 * round(1- (alpha / 255)) + b2 * round(alpha / 255); Result := RGB(rr,gr,br); end; |
Re: Simple Grafikfunktionen
Super, danke das seh ich mir genauer an ;-)
|
Re: Simple Grafikfunktionen
Zeichenprogramme (Photoshop) und Grafiklibs (OpenGL, Graphics32) werden aber andere Formeln benutzen, die evtl. sogar in den Farbkomponenten unterschiedlich gewichtet sind.
|
Re: Simple Grafikfunktionen
Also ich habe folgende verwendet von Wikipedia:
C = αA + (1 − α)B Die funzt auch eigentlich gut, muss das nur noch etwas optimieren, denke ich poste n Screenie wenn ichs richtig hinbekommen habe ;-) |
Re: Simple Grafikfunktionen
Das ist genau die, die ich auch verwende, nur dass ich das Alpha (nach außen) auf ein byte, also auf 0..255 anstatt auf 0..1 abbilde.
|
Re: Simple Grafikfunktionen
Ja, wusste ich :D
Ok, das hab ich etwas verplant ^^ |
Re: Simple Grafikfunktionen
Also, ich habe mir jetzt eine Funktion zusammengebastelt, aber es funzt irgendwie net richtig!
Delphi-Quellcode:
Also erstmal is das Problem, dass die Prozedur ziemlicih langsam ist...kann man sie irgendwie beschleunigen? Also ich kann ja nicht mit Rectangle zeichnen, weil ich ja immer die PixelFarbe herausbekommen muss!
function GetBlendedColor(Color1, Color2: TColor; Alpha: Integer): TColor;
var r1, g1, b1, r2, g2, b2, r, g, b: Integer; begin r1 := GetRValue(Color1); g1 := GetGValue(Color1); b1 := GetBValue(Color1); r2 := GetRValue(Color2); g2 := GetGValue(Color2); b2 := GetBValue(Color2); r := Alpha * r1 + (1 - Alpha) * r2; g := Alpha * g1 + (1 - Alpha) * g2; b := Alpha * b1 + (1 - Alpha) * b2; Result := RGB(r, g, b); end; procedure InnerGlow(Color: TColor; Size, Alpha: Integer; Rect: TRect; Canvas: TCanvas); var CurAlpha: Extended; CurAlphaRounded, i, x, y: Integer; PixelColor: TColor; begin CurAlpha := 0; for i := 1 to Size do begin CurAlpha := Alpha / Size * i; CurAlphaRounded := Round(CurAlpha); for x := Rect.Left + i - 1 to Rect.Right - i + 1 do begin y := Rect.Top + i - 1; PixelColor := GetPixel(Canvas.Handle, x, y); Canvas.Pixels[x, y] := GetBlendedColor(Color, PixelColor, CurAlphaRounded); y := Rect.Bottom - i + 1; PixelColor := GetPixel(Canvas.Handle, x, y); Canvas.Pixels[x, y] := GetBlendedColor(Color, PixelColor, CurAlphaRounded); end; for y := Rect.Top + i to Rect.Bottom - i do begin x := Rect.Top + i - 1; PixelColor := GetPixel(Canvas.Handle, x, y); Canvas.Pixels[x, y] := GetBlendedColor(Color, PixelColor, CurAlphaRounded); x := Rect.Bottom - i + 1; PixelColor := GetPixel(Canvas.Handle, x, y); Canvas.Pixels[x, y] := GetBlendedColor(Color, PixelColor, CurAlphaRounded); end; end; end; Außerdem funktioniert das alles auch irgendwie noch nicht so richtig! Wenn die Fläche Quadratisch is gehts, sonst malt er das einfach nicht richtig!!! Wisst ihr woran das liegen koennte? `Danke soweit schonmal! |
Re: Simple Grafikfunktionen
Hallo,
anstatt mit GetPixels würd ich mit Scanline arbeiten. Oder gleich mit GDI+. |
Re: Simple Grafikfunktionen
Ok, danke da informier ich mich dann morgen drüber, weil das is mir heute zu spät ;-)
Danke für die Hilfe :) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:00 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