![]() |
Canvas transparente linien zeichnen ?!
Hallo
Ich arbeite an einer kleinen Komponente. Ich habe alles schön auf eine Canvas gezeichnet und möchte nun noch einen kleinen Verlauf darauf legen. Der Verlauf ansich ist nicht das Problem, ich möchte diesen aber transparent machen. Wie kann ich also transparente linien zeichen? Danke schon ma... |
Re: Canvas transparente linien zeichnen ?!
Ohne weiteres überhaupt nicht. Die Windows GDI unterstützut keine transpartenz. Wenn müsste man etwas trixen aber das kann
aufwendig werden. Mit der Verwendung der GDI+ oder mit den Graphic-Komponenten der ![]() |
Re: Canvas transparente linien zeichnen ?!
oder selber berechnen
OK, transparent würde man nix sehn, aber Halbtransparent ... einfach die Farbe der Teiltransparenten Farbe mit der Farbe dahinter verrechnen und notfalls "Pixelweise" reinzeichnen |
Re: Canvas transparente linien zeichnen ?!
danke euch beiden für eure antworten...
und wie berechne ich das denn? |
Re: Canvas transparente linien zeichnen ?!
Liste der Anhänge anzeigen (Anzahl: 1)
Ok, keine Linie. Aaber ein Rechteck, was eigentlich auch eine "dicke" Linie ist, das Prinzip ist das selbe. ;)
Wenn es um Horizontale oder Vertikale Linie(n) geht ist es einfach. Will man nun Diagonele Linie(n) wird es komplexer da man diede selbst berechnen muss.
Delphi-Quellcode:
//////////////////////////////////////////////////////////////////////////////
// Fillrect per Bitmap & Scanline (unoptimiert) // - mittelschnell // - medium rechenrechenintensiv // - "T" for Transparent & "S" for Scanlinie // by turboPASCAL aka MatthiasG. procedure FillrectTS(Bitmap: TBitmap; X1, Y1, X2, Y2: integer; Color: TColor32); type TRGBA = Record R,G,B,A: Byte; end; TRGBQuadArray = array[WORD] of TRGBA; pRGBQuadArray = ^TRGBQuadArray; var p: pRGBQuadArray; x,y: integer; h1,h2: single; begin if (X2 > X1) and (Y2 > Y1) then with Bitmap.Canvas do begin if X1 < ClipRect.Left then X1 := ClipRect.Left; if Y1 < ClipRect.Top then Y1 := ClipRect.Top; if X2 > ClipRect.Right then X2 := ClipRect.Right; if Y2 > ClipRect.Bottom then Y2 := ClipRect.Bottom; end; if Bitmap.PixelFormat <> pf32Bit then Bitmap.PixelFormat := pf32Bit; h1:= GetAValue(Color) / 255; h2:= 1 - h1; for y := y1 to y2 - 1 do begin p := Bitmap.Scanline[y]; for x := x1 to x2 - 1 do begin p[x].R := BYTE( round( h1 * p[x].R + h2 * GetRValue(Color) ) ); p[x].G := BYTE( round( h1 * p[x].G + h2 * GetGValue(Color) ) ); p[x].B := BYTE( round( h1 * p[x].B + h2 * GetBValue(Color) ) ); end; end; end; |
Re: Canvas transparente linien zeichnen ?!
einfach wie bei einem Farbverlauf aus 2 Farben
du nimmst das eine Pixel, dann das andere Pixel berechnest einen Mischwert (je nach stärke der Transparenz) und fertig. wobei man hierbei eventuell gleich alles zusammenlegen könnte und z.B. bei einem zweifarbigem Verlauf, dann einfach alle 3 Farbwerte gleichzeitig zusammenrechnet. je Pixel-Farbe dann im Prinzip etwa so: Pixel[x, y].Rot := (Pixel[x, y].Rot * TransparenzInProzent) + Verlauf1.Rot * VerlaufInProzent * (100 - TransparenzInProzent) + Verlauf2.Rot * (100 - VerlaufInProzent) * (100 - TransparenzInProzent) |
Re: Canvas transparente linien zeichnen ?!
Liste der Anhänge anzeigen (Anzahl: 1)
Na also ich weiss nicht...
eigentlich gings mir damit ja darum den text meiner komponente ein und ausblenden zu lassen. Ich versuchte jetzt das Ausblenden erstmal hinzukregen. Es scheint mir aber für meinen Fall die bessere Lösung zu sein, einfach die Schrift Farbe anzupassen... Vorteil: einfacher, schneller. Nachteil: Es wird immer nur die ganze Zeile eine andere Farbe haben -> also etwas ungenauer. Ich hab hier mal die Kompo gepostet, ich kriegs aber einfach nicht hin mit dem berechnen der richtigen Farben. Wenn man die Kompo so kompiliert wird, wechselt die schriftfarbe einmal, sie soll aber schön ausfaden... Vielleicht könnt ihr ja mal einen Blick in den Code wagen... |
Re: Canvas transparente linien zeichnen ?!
und, was sagt ihr die die es heruntergeladen habt? wie würdet ihr das tun?
|
Re: Canvas transparente linien zeichnen ?!
Ich weiß nicht, ob ich dein Problem richtig verstanden habe. Du willst dass die Buchstaben des Textes einen transaparenten Farbverlauf haben?
Dann würde ich zuerst die Maße des Textes bestimmen (kriegt man z.B. durch DrawText mit entsprechenden Parametern heraus) und ein temporäres Bitmap mit diesen Ausmaßen erzeugen erzeugen. Dort müsste dann der Hintergrund hineinkopiert werden (man kann durch eine Message namens WM_EraseBackground oder so ähnlich afaik ein neuzeichnen des Hintergrunden veranlassen). AUf diesem Bitmap würde ich dann mit der Funktion von TurboPASCAL einen Verlauf erzeugen. Anschließend würde ich den Text auf einem zweiten Bitmap weiß auf Schwarz ausgeben. Dieses schwarz/weiße Bitmap wird als Maske verwendet. Jeder Pixel repräsentiert hier den Alphatransparenzwert für den Pixel auf dem Verlaufs-Bitmap. Dieser wird dann benutzt, um das Verlaufsbitmap transparent auf den Hintergrund (der muss dazu ggf. erst in ein weiteres Puffer-Bitmap kopier twerden) zu übertragen, wozu man TurboPASCALS Funktion abwandeln kann. Dieses letzte Pufferbitmap wird dann schließlich auf das Canvas kopiert. Diese Version ist noch etwas umständlich und ineffizient, allerdings kann man einige der Schritte in eine Funktion zusammenfassen und dadurch auch die Anzahl der speicherfressenden Pufferbitmaps reduzieren. |
Re: Canvas transparente linien zeichnen ?!
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:57 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