Delphi-PRAXiS
Seite 1 von 2  1 2      

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.


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