Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Canvas transparente linien zeichnen ?! (https://www.delphipraxis.net/134225-canvas-transparente-linien-zeichnen.html)

cherry 18. Mai 2009 06:10


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...

turboPASCAL 18. Mai 2009 06:35

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 GR32-Units sollte das einfacher funktionieren.

himitsu 18. Mai 2009 06:47

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

cherry 18. Mai 2009 06:48

Re: Canvas transparente linien zeichnen ?!
 
danke euch beiden für eure antworten...
und wie berechne ich das denn?

turboPASCAL 18. Mai 2009 06:57

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;

himitsu 18. Mai 2009 07:01

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)

cherry 18. Mai 2009 14:04

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...

cherry 18. Mai 2009 18:04

Re: Canvas transparente linien zeichnen ?!
 
und, was sagt ihr die die es heruntergeladen habt? wie würdet ihr das tun?

Namenloser 18. Mai 2009 18:55

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.

cherry 19. Mai 2009 05:48

Re: Canvas transparente linien zeichnen ?!
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von NamenLozer
Ich weiß nicht, ob ich dein Problem richtig verstanden habe. Du willst dass die Buchstaben des Textes einen transaparenten Farbverlauf haben?

naja, nicht ganz. Ich habe mir das so vorgestellt. ter text scrollt ja ständig von unten nach oben (wie z.b ein filmabspann). das funktioniert eigentlich so weit auch ganz gut. jetzt möchte ich aber, dass der text nicht einfach so erscheint respektive verschwindet, sondern dass er ein und ausblendet. in der mitte der komo soll der text immer mit der vollen Farbe angezeigt werden. für das bessere Verständtniss habe ich ein Bild gepostet.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:53 Uhr.
Seite 1 von 2  1 2      

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