Delphi-PRAXiS

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.

turboPASCAL 19. Mai 2009 10:01

Re: Canvas transparente linien zeichnen ?!
 
Guck dir das mal an -> http://www.delphipraxis.net/internal...=485973#485973

Luckie 19. Mai 2009 10:14

Re: Canvas transparente linien zeichnen ?!
 
Zitat:

Zitat von cherry
Wie kann ich also transparente linien zeichen?

Hast du mal überlegt, was du da willst bzw. geschrieben hast? Ich formuliere es mal etwas anders:
Zitat:

Wie kann ich eine durchsichtige Linie zeichnen?
Und das dies unsinnig ist, dürte klar sein. Dewesegen verstehe ich nicht so ganz, was du eigentlich willst. :gruebel:

cherry 19. Mai 2009 10:36

Re: Canvas transparente linien zeichnen ?!
 
Zitat:

Zitat von turboPASCAL

Genau, das wär eine Lösung.
Nur wollte ich das ganze halt ohne Bilder machen, da man die Farbe eigentlich einstellen können sollte.

Zitat:

Zitat von Luckie
... Dewesegen verstehe ich nicht so ganz, was du eigentlich willst. :gruebel:

Ich weiss, dass ich wohl ein bisschen für Verwirrung gesorgt habe. Deshalb habe ich ja auch ein Bild eingefügt wo man sehen kann was ich will. (siehe 2 Beiträge weiter oben.)

cherry 20. Mai 2009 15:22

Re: Canvas transparente linien zeichnen ?!
 
hat mir denn niemand einen tipp...
denn irgendwie habe ich mühe die Farben zu berechnen. Hier der Wichtigste Ausschnitt...
(Versuch die Schrift auszublenden...[alternativ]) <- siehe Bild weiter oben. Der ganze Code ist ebenfalls weiter oben gepostet.

Delphi-Quellcode:
procedure TSSText.TimerAction(Sender: TObject);
begin
  if tx <= 0 - Canvas.TextHeight(FLines.Strings[0]) * FLines.Count then
    tx := height;
  tx := tx - 1 - FSpeed;
  Repaint;
end;

procedure TSSText.PaintText;
var
  R,G,B,I: Integer;
  txt: String;
begin
  if FLines.Count > 0 then
  begin
    Canvas.Brush.Style := bsClear;

    for I := 0 to FLines.Count -1 do
    begin
      if tx + Canvas.TextHeight(FLines.Strings[I]) * I < 50 then
      begin
      R := Round(GetRValue(Color1) + ((GetRValue(Canvas.Font.Color) - GetRValue(Color1)) *
        I / (50-1)));
      G := Round(GetGValue(Color1) + ((GetGValue(Canvas.Font.Color) - GetGValue(Color1)) *
        I / (50-1)));
      B := Round(GetBValue(Color1) + ((GetBValue(Canvas.Font.Color) - GetBValue(Color1)) *
        I / (50-1)));
        Canvas.Font.Color := RGB(R,G,B);
      end
      else
        Canvas.Font.Color := clFontOld;
      Canvas.TextOut(10, tx + Canvas.TextHeight(FLines.Strings[0]) * I, FLines.Strings[I]);
    end;

    Canvas.Brush.Style := bsSolid;
  end;
end;

procedure TSSText.Paint;
var
  Rect: TRect;
  R, G, B, I, Y: Integer;
begin

  Width := Width;
  Height := Height;

  // Rechteck
  Canvas.Brush.Color := ColorToRGB(FColor1);
  Canvas.Rectangle(0,0,Width,height);

  // übergabeparameter Rect bereitstellen,
  // wenn Verlauf ausgewählt
  if (FGradient <> grNone) then
  begin
   Rect.Left := 0;
   Rect.Top := 0;
   Rect.Right := Width;
   Rect.Bottom := height;
  end;

  // Verlauf herstellen
  if (FGradient = grTopToBottom) then
   DrawGradientH(Canvas, FColor1, FColor2, Rect)
  else if (FGradient = grLeftToRight) then
   DrawGradientV(Canvas, FColor1, FColor2, Rect);

  PaintText;

  // Rand Zeichnen
  if (FBorder) then
  begin
   Canvas.Pen.Color := ColorToRGB(FBorderColor);
   Canvas.Brush.Style := bsClear;
   Canvas.Rectangle(0,0,Width,height);
   Canvas.Rectangle(width,0,Width,height);
  end;

end;

Pfoto 20. Mai 2009 17:18

Re: Canvas transparente linien zeichnen ?!
 
Hallo cherry,

ich benutze u.a. folgendes Komponenten-Pack:
http://www.pegtop.de/delphi/componen...creenshots.htm

Dort gibt es einige Komponenten, mit denen auch sehr komplexe
Farbverläufe erstellt werden. Der Code sieht zwar heftig aus (für mich
als "Pseudo-Programmierer"), aber vielleicht kannst du was daraus lernen.

Er verwendet keine zusätzlichen Libs wie Graphics32 o.ä., sondern erstellt die
Transparenzen von Grund auf mit eigenen Routinen.

Gruß
Jürgen

cherry 26. Mai 2009 13:35

Re: Canvas transparente linien zeichnen ?!
 
Liste der Anhänge anzeigen (Anzahl: 2)
hy there...

So. Ich hab mich jetzt doch für GR32 und GR32_Image entschieden.
Eigentlich funktioniert fast alles wie es soll, nur ein Problem hab ich noch...

Die Komponente hat 3 Farbverläufe. Der erste bildet den Hintergrund der Komponente.
Die Zwei anderen bedecken jeweils 30px oben und unten und sind transparent. Diese dienen dem Ausblenden der Schrift.

Problem:
Mein Problem betrifft der letzte Farbverlauf, er wird nicht immer richtig dargestellt, --> siehe Bild. Dies ist abhänig von der Höhe der Komponente, soviel ist sicher. Warum das aber so passiert?! - Ich finds nicht heraus. Anbei die aktuellste Version des Codes...

Vielen Dank schon mal.

cherry 26. Mai 2009 15:40

Re: Canvas transparente linien zeichnen ?!
 
habs herausgefunden...
lag an der schleiffe für den Ferlauf, ich hab da falsche Werte gebraucht.
Funzt alles wies soll...
werde später das Resultat noch hochladen..


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:44 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