AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Canvas transparente linien zeichnen ?!

Ein Thema von cherry · begonnen am 18. Mai 2009 · letzter Beitrag vom 26. Mai 2009
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von cherry
cherry

Registriert seit: 14. Nov 2005
561 Beiträge
 
RAD-Studio 2009 Ent
 
#1

Canvas transparente linien zeichnen ?!

  Alt 18. Mai 2009, 07:10
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...
Ist das nur mein Gefühl, oder ist die ganze Welt verrückt geworden!?
  Mit Zitat antworten Zitat
Benutzerbild von turboPASCAL
turboPASCAL

Registriert seit: 8. Mai 2005
Ort: Sondershausen
4.274 Beiträge
 
Delphi 6 Personal
 
#2

Re: Canvas transparente linien zeichnen ?!

  Alt 18. Mai 2009, 07:35
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.
Matti
Meine Software-Projekte - Homepage - Grüße vom Rüsselmops -Mops Mopser
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#3

Re: Canvas transparente linien zeichnen ?!

  Alt 18. Mai 2009, 07:47
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
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von cherry
cherry

Registriert seit: 14. Nov 2005
561 Beiträge
 
RAD-Studio 2009 Ent
 
#4

Re: Canvas transparente linien zeichnen ?!

  Alt 18. Mai 2009, 07:48
danke euch beiden für eure antworten...
und wie berechne ich das denn?
Ist das nur mein Gefühl, oder ist die ganze Welt verrückt geworden!?
  Mit Zitat antworten Zitat
Benutzerbild von turboPASCAL
turboPASCAL

Registriert seit: 8. Mai 2005
Ort: Sondershausen
4.274 Beiträge
 
Delphi 6 Personal
 
#5

Re: Canvas transparente linien zeichnen ?!

  Alt 18. Mai 2009, 07:57
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;
Angehängte Dateien
Dateityp: zip trcolorgdi.source_203.zip (63,2 KB, 22x aufgerufen)
Matti
Meine Software-Projekte - Homepage - Grüße vom Rüsselmops -Mops Mopser
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#6

Re: Canvas transparente linien zeichnen ?!

  Alt 18. Mai 2009, 08:01
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)
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von cherry
cherry

Registriert seit: 14. Nov 2005
561 Beiträge
 
RAD-Studio 2009 Ent
 
#7

Re: Canvas transparente linien zeichnen ?!

  Alt 18. Mai 2009, 15:04
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...
Angehängte Dateien
Dateityp: pas softscrollingtext_186.pas (9,5 KB, 18x aufgerufen)
Ist das nur mein Gefühl, oder ist die ganze Welt verrückt geworden!?
  Mit Zitat antworten Zitat
Benutzerbild von cherry
cherry

Registriert seit: 14. Nov 2005
561 Beiträge
 
RAD-Studio 2009 Ent
 
#8

Re: Canvas transparente linien zeichnen ?!

  Alt 18. Mai 2009, 19:04
und, was sagt ihr die die es heruntergeladen habt? wie würdet ihr das tun?
Ist das nur mein Gefühl, oder ist die ganze Welt verrückt geworden!?
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#9

Re: Canvas transparente linien zeichnen ?!

  Alt 18. Mai 2009, 19:55
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.
  Mit Zitat antworten Zitat
Benutzerbild von cherry
cherry

Registriert seit: 14. Nov 2005
561 Beiträge
 
RAD-Studio 2009 Ent
 
#10

Re: Canvas transparente linien zeichnen ?!

  Alt 19. Mai 2009, 06:48
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.
Miniaturansicht angehängter Grafiken
sstext_329.jpg  
Ist das nur mein Gefühl, oder ist die ganze Welt verrückt geworden!?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:06 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