Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Bitmaps in Transparenz ausblenden lassen (https://www.delphipraxis.net/181492-bitmaps-transparenz-ausblenden-lassen.html)

onepiecefreak2 19. Aug 2014 21:25


Bitmaps in Transparenz ausblenden lassen
 
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo meine Gutsten,

also ich habe nun ein 32bit Bitmap. Dieses hat eine 50%ige Transparenz, ist also genau halbdurchsichtig. Das hat sich nach einigem rumprobieren auch prima in 'nem TImage anzeigen lassen. Genauso wie ich es brauchte. Nun hängt mein Projekt nur noch von einer Sache ab: Dem Ausblenden dieses Bitmaps in komplette Transparenz.

Ich habe mich mehrere Tage dumm und dusselig gesucht und viele Codes gefunden, die mich meiner Lösung immer nur ganz nah brachten. Schlussendlich waren sie aber nicht für das Ausblenden gedacht, das ich gesucht habe.

Ich habe es über die RGBA-Werte versucht. Mithilfe von ScanLine und subtrahieren des Alphawerts. Irgendwo hing es immer daran, dass das Bild nicht ausgeblendet wurde sondern einfach in seiner Ursprungsfarbe blieb (um es so auszudrücken: Nach Ausführen des Codes hat das Bild seine Transparenz verloren und bekam sie nie wieder, selbst nach etlichen Möglichkeiten ihr die Eigenschaft Transparent wieder auf true zu setzen oder das Alphaformat des Bitmaps zu ändern), sozusagen würde ein halbtransparentes schwarz zu einem normalen schwarz ohne irgendwelche Transparenz werden.

Ich suche also einen Code oder (hoffentlich mir noch unbekannte) Hilfeartikel aus anderen Foren oder Hilfeseiten, die mir bei der Lösung helfen können.

Wie gesagt ein halbtransparentes Bild soll komplett transparent werden und das in einem Ausblendeffekt!

Puhh, das war eine Menge Text. Ich hoffe ihr könnt mir helfen.

P.S: Ich habe die Bitmap angehangen. (Eigentlich sind es 2, aber sie haben die gleiche Transparenzstufe. Bis auf die Farbe haben sie alles gleich ;))

Medium 20. Aug 2014 01:01

AW: Bitmaps in Transparenz ausblenden lassen
 
Die GDI, auf die TBitmap mitsamt Canvas aufsetzt, ist nur in Teilen "alpha-fähig". Mit viel Fummelei und Vermeidung mancher Funktionen lässt sich da zwar etwas deichseln, aber ich halte das für hässliche Frickelei. Du würdest erheblich komfortabler mit einer Gafik-Lib leben, die Transparenz durch und durch vorsieht. Ich empfehle hier sehr gerne immer die Graphics32 Lib, die zudem auch noch ziemlich flott ist (ja, auch .Pixels[]-Aufrufe) und eine ganze Reihe an nützlichen Zusatzfunktionen bietet. Es gäbe auch noch die GDI+, diese ist aber auch schon wieder abgekündigt und ich fand den Umgang damit irgendwie immer sehr "klobig".

PS: (Baseline) JPEG unterstützt ebenfalls keine Alphakanäle ;)

onepiecefreak2 20. Aug 2014 10:24

AW: Bitmaps in Transparenz ausblenden lassen
 
Danke für deine Antowrt.
In manchen von diesen Artikeln habe ich auch schon GID+ gelesen. Allerdings habe ich erstmal nach "Nur-Delphi" Code gesucht. Ist der Umgang mit Graphics32 Lib sehr schwer?

Ich werde mich gleich mal nach Tutorials umsehen. Hoffentlich wird das was.

Aber wie gesagt, Bitmaps in einem Image habe ich transparent bekommen. Ich habe sie eben nicht ausblenden lassen können ohne das die ihr "gottverfluchte" :D Transparenz verlieren.

Ich hoffe aufs Beste. Bis bälde.

P.S: Warum sind die Bilder plötzlich im jpg Format o.O . Eigentlich sollten das bmp's sein... sry for that :)

P.P.S: Ich schreibe gerade von Arbeit daher kann ich die bmp's gerade nicht nachladen. Sollte sie jemand wollen, einfach nachfragen.

Blup 20. Aug 2014 13:19

AW: Bitmaps in Transparenz ausblenden lassen
 
Ausgangssituation:
Bitmap "A" Hintergrund
Bitmap "B" Vordergrund mit transparenten Bereichen

- eine neue Bitmap "C" als Kopie von "A" erzeugen
- "B" transparent auf "C" zeichnen
- "C" anzeigen und schrittweise auf "A" umblenden (oder umgekehrt)

onepiecefreak2 20. Aug 2014 17:42

AW: Bitmaps in Transparenz ausblenden lassen
 
Also ich weiß nicht ob ich gerade auf der Leitung stehe oder nicht, aber irgndwie komm ich nicht hinterher.

Aber ich versuche es:
"C" wird im Quellcode erstellt, als ein TBitmap.
Dieses bekommt als Inhalt den Hintergrund.
Nun wird das halbtransparente Bild auf "C" gezeichnet und schrittweise ausgegeben.

Habe ich das richtig zusammengefasst?

Wenn ja, dann musst du mir erklären wie ich es denn schrittweise ausgebe. Weil diese Ausgabe ist ja dann im Prinzip der Ein-/Ausblendeffekt. Und den zu bewerkstelligen ist ja meine Frage.

Sry, dass ich mich so dumm anstelle :D.

Hoffe auf eine Antwort ;)

Harry Stahl 20. Aug 2014 20:15

AW: Bitmaps in Transparenz ausblenden lassen
 
Du kannst z.B. diese Funktion, die voraussetzt, dass Deine Bitmap eine 32-Bit - Bitmap ist, nutzen, um die Transparenz zu ändern:

Delphi-Quellcode:

Type
  TRGB32 = packed record
    B, G, R, A: Byte;
  end;

  TRGB32Array = packed array[0..MaxInt div SizeOf(TRGB32)-1] of TRGB32;
  PRGB32Array = ^TRGB32Array;

procedure SetAlphaValue (bm: TBitmap; val: Byte);
var
  y, x, LineLen: Integer;
  FirstLine : PRGB32Array;
begin
  FirstLine := bm.ScanLine[0];
  LineLen := - bm.width;

  for y := 0 to bm.Height-1 do begin
    for x := 0 to bm.Width-1 do begin
      FirstLine[y*LineLen+x].A := val;
    end;
  end;
end;
"A" steht für Alpha-Value und ist der Wert, der die Transparenz eines Bildpunktes in der Bitmap beschreibt.

Du nimmst also Dein Original-Bitmap und weist dies einer Kopie zu. Die Kopie veränderst Du per Aufruf mit SetAlpha-Value, indem Du bei den jeweiligen Aufrufen bei der Variablen "Val" von 255 auf 0 runtergehst und zeigst dann die veränderte Kopie auf Deinem Canvas an. Zur Anzeige einer transparenten Bitmap auf Deinem Canvas musst Du eine Funktion nutzen, die transparente Bitmaps zeichnen kann, z.B. aus der Windows-API die "AlphaBlend".

Diese Lösung deckt eine Konstellation nicht ab, die aber nach Deiner Beschreibung auch nicht gefordert ist: Hat die Grafik bereits einzelne transparente Pixel, werden diese bei Aufruf von "SetAlphaValue" immer mit dem Wert von "Val" überschrieben, daher müsste man die Funktion anders gestalten, wollte man auch diese Konstellation erfassen. Das habe ich hier aber weggelassen, um die Sache nicht zu verkomplizieren.

Übrigens: Welche Delphi-Version nutzt Du und auf welchem Zielsystem soll Dein Programm eingesetzt werden? Solche Hintergründe sind relativ oft relevant für die korrekte Beantwortung solcher Fragen.

onepiecefreak2 20. Aug 2014 21:30

AW: Bitmaps in Transparenz ausblenden lassen
 
Ich benutze das RAD-Studio XE5, mit dem ich seit geraumer Zeit arbeite. Besitze allerdings auch Delphi 7 und 5. Mein Programm sollte auf mind. Windows 7 funzen. Ich glaube aber gelesen zu haben, dass Win XP in etwa Win 7 sein soll, nur eben mit mehr Sicherheit, anderem Design etc. Wenn dem so ist, sollte es auch auf XP lauffähig sein.

Da die diese Transparenz auf alle mögliichen Konstellationen von Bildern funktionieren soll, ist dein Code eigentlich die "allgemeine" Lösung.

Nun muss ich Depp nur nochmal Canvas wiederholen ^^

P.S: Ich habe mir auf Anraten eines Posts in diesem Thread auch Graphics32 für XE5 angeschafft. Und hing dort an einem anderen Problem fest. Wenn ich den Alphawert des Bildes aus dem TImage32 auf 0 (voll transparent) setze, wird die Hintergrundfarbe des TImage32 angezeigt, anstatt dem TImage dahinter oder der Form.

Harry Stahl 20. Aug 2014 23:27

AW: Bitmaps in Transparenz ausblenden lassen
 
Liste der Anhänge anzeigen (Anzahl: 2)
OK, wenn Du XE5 hast, könntest Du das Problem auch ganz einfach mit FireMonkey lösen (z.B. in einem externen Dialog, den Du über eine DLL lädst - oder Du entwickelst das Programm direkt in FireMonkey :wink:).

Anliegend mal ein Beispiel, für das ich keine 2 Minuten brauchte, um es zu entwickeln (soll sagen, wie schnell es mit FMX geht).

In einer TImage habe ich Dein Grünes Bitmap mit 50% Transparenz geladen (habe ich erst später gelesen, dass es schon eine Transparenz haben sollte).

Das TImage habe ich visuell mit der Trackbar gebunden, so dass der Wert Value von der Trackbar die Eigenschaft "Opacity" des Images ändert.

Ein ScreenShot und das Programm liegt anbei. Wenn Du die Trackbar ganz nach links ziehst, wird die Image ganz ausgeblendet.

onepiecefreak2 21. Aug 2014 07:02

AW: Bitmaps in Transparenz ausblenden lassen
 
Hmm,

also die Eigenschaft Opacity von Komponenten in FireMonkey kannte ich schon. Ich habe nämlich vor Kurzem erst meine App fertig programmiert. Aber das ich FireMonkey auch für Windows-Applikationen benutzen kann, war mir neu. Ich dachte FireMonkey ist für mobile Geräte?

Na, vieleicht habe ich einfach nur nicht drauf geachtet ^^. Ja, das wirds gewesen sein.
Ich schau einfach mal in das Demoprogramm. Dann wird sich mir einiges erschließen.

Werde ich heute Nachmittag, so gegen 18 Uhr mal testen. Wenns geklappt hat, bedanke ich mich jetztz schonmal bei dir Harry. ;)

P.S: Ich habe mal deine Homepage besucht. Irgendwie sagt sie mir, dass du ein Profi im Umgang mit FireMonkey und VCL bist. Find ich toll das so einer mir hilft :)

P.P.S: Vllt. kannst du mir ja einen Rat noch mit auf den Weg geben. Glaubst du XE5 ist in Ordnung und wäre eine neuere Version besser. (Neuer bedeutet ja nicht gleich besser, ne? ;))

Blup 21. Aug 2014 12:02

AW: Bitmaps in Transparenz ausblenden lassen
 
Zitat:

Zitat von onepiecefreak2 (Beitrag 1269275)
Also ich weiß nicht ob ich gerade auf der Leitung stehe oder nicht, aber irgndwie komm ich nicht hinterher.

Aber ich versuche es:
"C" wird im Quellcode erstellt, als ein TBitmap.
Dieses bekommt als Inhalt den Hintergrund.
Nun wird das halbtransparente Bild auf "C" gezeichnet und schrittweise ausgegeben.

Habe ich das richtig zusammengefasst?

Beim Umblenden gibst du ein Mischbild aus "A" und "C" aus.
D = A * ((1 - x) + C * x
Wobei x schrittweise von 0,0 zu 1,0 erhöht wird.

onepiecefreak2 21. Aug 2014 13:39

AW: Bitmaps in Transparenz ausblenden lassen
 
Achso, jetzt verstehe ich wie das funktionieren soll.

Ist eigentlich auch keine dumme Idee. Vllt. auch die einzige Möglichkeit mit "Nur-Delphi" Code das hinzukriegen ^^.

Dennoch Blup werde ich erstmal die Möglichkeit von Harry Stahl versuchen umzusetzen. Da ich schon mit Firemonkey gearbeitet habe und nun rausfand, dass ich das auch für VLC benutzen kann, wird die Opacity-Eigenschaft sicher alles zu meiner Zufriedenheit richten. Wenn nicht komme ich auf deins zurück ;)

Dank' fürs Helfen!

Medium 21. Aug 2014 16:59

AW: Bitmaps in Transparenz ausblenden lassen
 
Zitat:

Zitat von onepiecefreak2 (Beitrag 1269405)
dass ich das auch für VLC benutzen kann,

VLC ist ein ziemlich guter Video-Player ;)
Und auch die VCL wäre hier im Falschen zusammenhang, denn genau das geht nicht: VCL und Firemonkey mischen! (Zumindest nicht ohne diverse Tricks und Umwege und Abstriche.) Du möchtest Firemonkey für ein Windows-Programm benutzen; ein Windows-Programm ist aber noch lange nicht automatisch ein Programm auf Basis der VCL.
Nur um das mal zu klären. Hat jetzt keine Auswirkungen. Weitermachen mit Dienst :D

Harry Stahl 21. Aug 2014 17:33

AW: Bitmaps in Transparenz ausblenden lassen
 
Zitat:

Zitat von onepiecefreak2 (Beitrag 1269405)
Dennoch Blup werde ich erstmal die Möglichkeit von Harry Stahl versuchen umzusetzen. Da ich schon mit Firemonkey gearbeitet habe und nun rausfand, dass ich das auch für VLC benutzen kann, wird die Opacity-Eigenschaft sicher alles zu meiner Zufriedenheit richten. Wenn nicht komme ich auf deins zurück ;)

Dank' fürs Helfen!

Leider kann man nicht einfach so VCL und FMX in einer Form mischen (geht zwar, aber nur mit Tricks bzw. mit Extra-Sofware, z.B. "HYDRA" von RemObjects).

Ich weiß ja nicht genau, wie und in welchem Zusammenhang die Funktion konkret in Deinem Projekt benötigt wird. Wenn man das auslagern kann, in einen Extra-Dialog, dann könntest Du diesen Dialog als FireMonkey-Dialog gestalten und in eine DLL-Datei verlagern und dann von der VCL-Anwendung aus die den FMX-Dialog aus der DLL aufrufen. Wie so etwas geht, habe ich hier schon einmal beschrieben: http://www.devpage.de/blog/firemonkey.htm, auch in einem kurzen Video kann man das sich ansehen: https://www.youtube.com/watch?v=MnqPmX3yJBM).

Generell sollte man aber abwägen, welchen Aufwand man betreiben will. Ist Dein Programm im Prinzip schon fertig und nur dieser Punkt ist offen, würde ich die VCL-Lösung ohne FMX fertig stellen, das Ausblenden einer Bitmap ist auch unter VCL machbar, man braucht da aber schon ein wenig mehr Kenntnisse in der Grafikprogrammierung, wenn man das mit einem Windows-Bitmap lösen möchte.

Ergänzend möchte ich noch erwähnen, dass man mit FMX neben IOS- und Android-Programme nicht nur Windows-Programme entwickeln kann, sondern auch Programme für MAC OS X.

onepiecefreak2 21. Aug 2014 18:51

AW: Bitmaps in Transparenz ausblenden lassen
 
Achso... ok.

Danke für die ausführlichen Erklärungen. Nun um das mal aufzudecken, ich will eine Textadventureeditor bauen. Vllt. kennt ihr Spiele wie Professor Layton oder Phoenix Wright? Das in etwa soll mein Programm als Editor bereitstellen um sich eigenen Storylines zu kreieren. Dieser Editor kommt mit allen Storys der Phoenix Wright und Professor Layton-Reihe, um dem Konsumenten auch am PC die Schönheit dieser Spiele zu schenken.

Zurück zum Thema, das Ein- und Ausblenden von Sprites sowie Aufblitzen von diesen, ist ein wichtiger Bestandteil dieser Spiele. Um es klar zu sagen, diese "Technik" macht ca. 50% des "Grafikerlebnisses" aus. (die anderen 50% sind die Texte, dessen Farben und die Story)

Ich werde demnach den Aufwand machen und mal diese DLL zusammenfriemeln. Ich bin gut im Nachmachen von Dingen aus YouTube-Videos :stupid:.

P.S: Habe nun dein Demoprogramm runtergeladen und habe mich dazu entschlossen mein Programm direkt in Firemonkey zu programmieren.

Damit ist das Thema beendet. Danke für die Hilfe und bis zum nächsten Mal!


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