TImage: Transparenz und Zeichnen

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...
Antworten
Nils
Beiträge: 130
Registriert: Mo 28. Mai 2007, 12:36
Kontaktdaten:

TImage: Transparenz und Zeichnen

Beitrag von Nils »

Ich erstelle mir via Code ein TImage. In einer entsprechenden Prozedur zeichne ich was ich muss via TImage.Canvas. Es gibt eine festgelegte Farbe für die Transparenz. Ich muss dem dynamisch erzeugtem TImage diesen Farbwert zuweisen. Jedes TBitmap bietet folgende Möglichkeit:

Code: Alles auswählen

TransparentMode  := tmFixed;
TransparentColor := clFuchsia;
Nur welches Bitmap verwendet TImage.Canvas ? Denn genau auf dieses muss der eben genannte Code angewendet werden. Ich möchte sozusagen jedes TImage erst voll transparent machen und danach anderes drüberzeichnen. Das garantiert, dass das Bild nur den benötigten Platz verdeckt und nicht mehr.
Meine Musik: spiker-music.net

Targion
Beiträge: 688
Registriert: Mi 3. Okt 2007, 21:00
OS, Lazarus, FPC: Linux (L 0.9.29 FPC 2.4.2)
CPU-Target: x86_64

Re: TImage: Transparenz und Zeichnen

Beitrag von Targion »

Ich glaube, mit TImage.Canvas zeichnest du über das Bild. Funktioniert folgendes?:

Code: Alles auswählen

Image1.Picture.Bitmap.TransparentMode  := tmFixed;
Image1.Picture.Bitmap.TransparentColor := clFuchsia;
...oderso.

Nils
Beiträge: 130
Registriert: Mo 28. Mai 2007, 12:36
Kontaktdaten:

Re: TImage: Transparenz und Zeichnen

Beitrag von Nils »

Das funktioniert leider nicht: Alles ist transparent für immer. Ich verstehe aber nicht warum.

Hier mal etwas mehr Code:

Code: Alles auswählen

constructor TSkinTrackBar.Create(...); 
begin
  ...
  with aForm do
  begin
    Image := TImage.Create(aForm);
    with Image do
    begin
      with Picture.Bitmap do
      begin
        TransparentColor := cTrans;
        TransparentMode  := tmFixed;
      end; 
      ...
    end;
  end;
end;
 
procedure TSkinTrackBar.Draw;
begin
  with Image.Canvas do
  begin
    Brush.Color := cTrans;
    Pen.Color   := cTrans;
    Rectangle(0, 0, Image.Width, Image.Height);      
 
    // ab hier wird drübergezeichnet
    // ...
  end;
end;
Meine Musik: spiker-music.net

Targion
Beiträge: 688
Registriert: Mi 3. Okt 2007, 21:00
OS, Lazarus, FPC: Linux (L 0.9.29 FPC 2.4.2)
CPU-Target: x86_64

Re: TImage: Transparenz und Zeichnen

Beitrag von Targion »

Du möchtest also erst dein TImage voll transparent haben und dann drüberzeichnen? Ich glaube, das Image ist schon standardmäßig transparent. Was erhältst du denn als Ergebnis, wenn du den Code ausführst? Und welche Lazarus-Version nutzt du? Was passiert, wenn du "with Image.Canvas do" mit "with Image.Picture.Bitmap.Canvas do" ersetzt?

Nils
Beiträge: 130
Registriert: Mo 28. Mai 2007, 12:36
Kontaktdaten:

Re: TImage: Transparenz und Zeichnen

Beitrag von Nils »

Ich habe bei meinem Skinsystem in der Index-Datei viele Definitionen. Unter anderem die Festlegung der Farbe für die Transparenz. Daher lese ich die aus, zeichne ein transparentes Rechteck (also in der Farbe für die Transparenz) und anschließend alle nötigen Bilder drüber. with Image.Picture.Bitmap.Canvas bringt leider nichts. Ich denke es ist vergleichbar mit Image.Canvas. Es scheint so, als würde der Kram nicht gezeichnet werden, das transparente Rechteck schon.
Ich hoffe Dir reichen meine Angaben, ansonsten sag mir das bitte sofort, ich würde mir dann die Arbeit machen und noch den Code von oben etwas weiter ausführen. Ich denke aber er ist so besser geeignet, da er übersichtlicher ist. Edit: Wenn ich mir es mal recht überlege, ist der Code oben komplett. Habe ihn eben extrem gekürzt, aber steht alles drinnen. In dem Sinne hat sich diese Sache erledigt.
Meine Musik: spiker-music.net

Hitman
Beiträge: 512
Registriert: Mo 25. Aug 2008, 18:17
OS, Lazarus, FPC: ArchLinux x86, WinVista x86-64, Lazarus 0.9.29, FPC 2.4.1
CPU-Target: x86
Wohnort: Chemnitz

Re: TImage: Transparenz und Zeichnen

Beitrag von Hitman »

Ich vermute, dass in dem Moment, wo man die Transparenzfarbe setzt, die ImageMask aktualisiert wird. Folglich solltest du das wohl erst nach dem Zeichnen setzen. Also erst das "transparente" Rechteck, dann den Inhalt, und danach erst TransparentColor und TransparentMode setzen.

Nils
Beiträge: 130
Registriert: Mo 28. Mai 2007, 12:36
Kontaktdaten:

Re: TImage: Transparenz und Zeichnen

Beitrag von Nils »

Ich habe genau das gemacht: In der Draw wie Du es gesagt hast, TransparentMode und Color gesetzt. Dann war der transparente Teil des Bilds Pink (die TransparentColor ist clFuchsia), der Rest wurde gezeichnet. Schön, dass man wieder was sehen kann, aber ich will es ja nicht pink sondern durchsichtig haben. Also dachte ich mir, bevor gezeichnet wird setze ich nur Transparent auf True. Kompiliert und angeschaut: Sah super aus. Wenn ich jedoch den Regler der TrackBar verschiebe, sieht das wie im Anhang gezeigt aus. Der Hintergrund ist schwarz, daher ist der linke Teil des Bildes wie gewünscht, der rechte jedoch nicht.
Meine Theorie ist, dass die Transparenz immer noch zum falschen Zeitpunkt gesetzt wird, denn es ist doch seltsam: Warum tritt der "pinke Fehler" erst auf, wenn ich den Regler verschiebe ? Abgesehen davon, kann man im rechten Teil des Bildes gut sehen, dass der Regler sobald er aus dem Startbereich bewegt wird, an den Stellen transparent wird, die vorher transparent waren. Woran könnte das liegen ?

Der Code von oben angepasst, wie er jetzt aussieht:

Code: Alles auswählen

constructor TSkinTrackBar.Create(...);
begin
  ...
  with aForm do
  begin
    Image := TImage.Create(aForm);
    with Image do
    begin
      Transparent := True;
      ...
    end;
  end;
end;
 
procedure TSkinTrackBar.Draw;
begin
  with Image.Canvas do
  begin
    Brush.Color := cTrans;
    Pen.Color   := cTrans;
    Rectangle(0, 0, Image.Width, Image.Height);            
    // ab hier wird drübergezeichnet
    // ...
    // alles fertig gezeichnet
    with Picture.Bitmap do
    begin
      TransparentColor := cTrans;
      TransparentMode  := tmFixed;
    end;
  end;
end;
Dateianhänge
Player_Trackbar.PNG
Player_Trackbar.PNG (843 Bytes) 2420 mal betrachtet
Meine Musik: spiker-music.net

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: TImage: Transparenz und Zeichnen

Beitrag von Christian »

kannst du dazu mal ein kleines Beispielprojekt machen ?
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

Nils
Beiträge: 130
Registriert: Mo 28. Mai 2007, 12:36
Kontaktdaten:

Re: TImage: Transparenz und Zeichnen

Beitrag von Nils »

Selbstverständlich. Viele der Units brauchen euch nicht zu interessieren. Das ganze Projekt ist eben sehr verkettet, daher habe ich um nicht zu lange mit Verschieben von Funktionen einer Unit in eine andere zu verbringen die Units eben mitgeschickt, kann ja nicht schaden. Es empfiehlt sich noch den Suchpfad für das OpBitmap einzufügen. Die Unit uSkinDraw ist die entscheidende Unit. Ich habe alle unwichtigen Sachen für dieses Problem rausgeschmissen. Interessante Prozeduren: TSkin.LoadSkin (Alles), TSkinTrackBar.Create (Anfang) und TSkinTrackBar.Draw (Ende). Und beim Testen dran denken: Den Regler bewegen und genau beobachten, was passiert.
Dateianhänge
Demo.zip
(211.99 KiB) 79-mal heruntergeladen
Meine Musik: spiker-music.net

Benutzeravatar
theo
Beiträge: 10869
Registriert: Mo 11. Sep 2006, 19:01

Re: TImage: Transparenz und Zeichnen

Beitrag von theo »

Nils hat geschrieben:Selbstverständlich.
Da blickt aber kaum einer durch.
Wenn du das Problem in einem kleinen extra-Projekt isolierst, dann kann man dir sicher besser helfen bzw. dann kannst du das Problem vielleicht auch selber lösen oder mindestens in den Bugtracker eintragen.
Debugging besteht oft darin, den Bug mit dem geringst möglichen "drumherum" zu erzeugen, und erst nachher, ihn zu beheben.
Einer muss dies tun, warum nicht gleich du? ;-)

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: TImage: Transparenz und Zeichnen

Beitrag von pluto »

Ich weiß jetzt im Moment nicht wo du da das Problem hast... eigentlich sollte es so Funktionieren.

Du hast z.b. ein Bild als Buffer.
Jetzt hast du ein zweites Bild. Dort stellst du Transparenz auf True und Transparenz Mode auf tmfixed und Transparenz Farbe auf die gewünschte Farbe.

Jetzt brauchst du das zweite Bild nur noch mit Draw auf den Buffer Kopieren. Dann müsste der gewünschte Effekt eigentlich Funktionieren.
MFG
Michael Springwald

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: TImage: Transparenz und Zeichnen

Beitrag von Christian »

Er schreibt doch aber gerade das es nicht funktioniert ! Hast dus nachgestellt ?
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: TImage: Transparenz und Zeichnen

Beitrag von pluto »

Ich habe sowas schon öfter gemacht nach der gleichen art und weiße. Unter Linux sollte das so gehen. Bei Gelegenheit werde ich es mal ausprobieren, ob das auch noch der Fall ist.

edit01: Nur um das richtig zu verstehen: Die trackbar links so sollte es aussehen, nach dem verschieben sieht es aber so aus wie auf der rechten hälfte ? Wo genau hättest du denn jetzt die Tranzparet ? da wo du verschieben kannst ? oder im Hintergrund ?

edit02:
Dann mach ich es doch mal anderrum:
Pic[22].Tranzpa....
ich nehme an Pic ist ein Array/Liste von TBitmap oder sowas....


Bei meiner 2D Engine mache ich das genau so: Ich setzte für jedes Bild was ich haben möchte die Transparent Eigenschaften.
MFG
Michael Springwald

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: TImage: Transparenz und Zeichnen

Beitrag von Christian »

Und das hast du schon mal mit einem der letzten SVN Versionen probiert ? (Nicht älter als 2 Monate)?
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: TImage: Transparenz und Zeichnen

Beitrag von pluto »

In der Vorletzten Version *G*... Bei der Version 07.09.08
MFG
Michael Springwald

Antworten