Entwickler-Ecke

Multimedia / Grafik - Halbtransparents bei Images (Alpha-Blending)


Alstar - Mo 03.10.05 00:09
Titel: Halbtransparents bei Images (Alpha-Blending)
Hallo!

Ich hatte imho ein ähnliches Thema schonmal gelesen, durch Suchhen aber keine gescheiten Ergebnisse bekommen: Wie bekomme ich es hin, dass ich ein Image Alpha-Blende, sprich es halb-transparent machen kann. Gibts dafür evtl schöne Components?

Alstar


Coder - Mo 03.10.05 00:14

Eine möglichkeit wäre dir PNGImage [http://pngdelphi.sourceforge.net] zu installieren und transparente PNGs zu verwenden.


Alstar - Mo 03.10.05 00:16

Nein. Ich meine nicht, dass die Bilder in den Images transparent werden sollen, sondern die Images an sich.
Also genau wie AlphaBlend und AlphaBlendValue bei Formularen, nur halt für Images.

Alstar


GTA-Place - Mo 03.10.05 08:07

Du könntest theoretisch DelphiX dafür verwenden.
DelphiX hat eine AlphaBlend-Funktion.


Alstar - Mo 03.10.05 11:37

Nein. Bitte kein DirectX oder OpenGL. Ich möchte ganz einfach nur eine Art TImage mit Alphablending :wink:

Alstar


MrSaint - Mo 03.10.05 11:55

Was liegt unter dem Image? was einfarbiges oder nochmal z.B. ein Bild?
Ich hab z.B. mal sowas geschrieben, das macht mir genau das mit nem Image auf weißem Hintergrund. Theoretisch solltest du aber mit allen beliebigen einfarbigen untergründen (:?: deutsches wort) machen können:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
procedure DrawAlphaBlend(var Bitmap: TBitmap; Percent: integer);
var
  bmpTemp             : TBitmap;
  r,
  g,
  b,
  x,
  y                   : integer;
  RGB                 : longint;
begin
  x := 0;
  while (x < Bitmap.Width) do
  begin
    y := 0;
    while (y < Bitmap.Height) do
    begin
      RGB := ColorToRGB(Bitmap.Canvas.Pixels[x, y]);
      // der RGB Wert ist "umgedreht"
      r := (RGB and $0000FF);
      g := (RGB and $00FF00shr 8;
      b := (RGB and $FF0000shr 16;

      r := r + (($FF - r) * Percent div 100);
      g := g + (($FF - g) * Percent div 100);
      b := b + (($FF - b) * Percent div 100);

      Bitmap.Canvas.Pixels[x, y] := r + (g shl 8) + (b shl 16);

      inc(y);
    end;
    inc(x);
  end;
end;


Wenn du in den Zeilen 23, 24 und 25 die $FFs in die Werte deiner Untergrund-Farbe tauschst, sollte das funktionieren... Oder du machst gleich nen Parameter der Procedure draus..




MrSaint


Alstar - Mo 03.10.05 12:01

Das was die Sache ja kompliziert macht, ist das ein weiteres Image drunterliegt. Außerdem weiß ich nicht wie schnell dein Code ist, da es sozusagen eine Art Animation werden soll.
Das untere Bild bleibt stehen und das obere wird drübergeblendet.

Alstar


Alstar - Mo 03.10.05 13:28

Also ich hab mein Problem mit der Animation jetzt komplett anders gelöst.
Wäre aber dennoch nett, wenn jemand wüsste, ob es ein AlphaBlend-fähiges TImage gibt, damit ich mir beim nächsten Mal die Arbeit ersparen kann :wink:

Alstar


MathiasH - Mo 03.10.05 22:23

Hallo
Mit einem TImage kann ich zwar nicht dienen, aber was hältst du davon:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/bitmaps_0fzo.asp

einfach die Parameter zusammensuchen, oder - bei ausreichenden Englisch Kenntnissen der MSDN-Seite entnehmen (gibts bestimmt in Tutorials) und losblenden

Die Methode oben dürfte übrigens nicht besonders schnell sein, da sie Canvas.pixels benutzt, was mehr als langsam für große Bilder ist. Wenn du es von Hand machen willst empfehle ich dir "Scanline".

Mathiash


Alstar - Mo 03.10.05 23:05

Wie gesagt: Das Blenden muss (da es eine Animation sein soll) sehr schnell, also in Echtzeit passieren

Alstar


Lossy eX - Di 04.10.05 09:14

Sofern die Bilder noch klein genug sind sollte es problemlos per Software gehen. Wenn sie aber größer sind solltest du tunlichst auf eine Hardwarebeschleunigung zurückgreifen.

Wenn per hand, dann ich dir auch nur raten das Ganze mittels Scanline zu machen. Quellcode beispiele dazu solltest du hier im Forum genügend finden. Ich kann dir aber nur raten achte nicht zu sehr auf den Speicherverbrauch Geschwindigkeit ist dabei wichtiger. Also scheue dich nicht so viel wie Möglich zu puffern. Das spart imens Rechenzeit.

Evtl. solltest du auch auf das TImage verzichten und die Bilder lieber per Hand auf dein Formular zeichnen. Und zwar so, dass du dir ein temporäres Bild erstellst in dem du deinen Hintergrund ganz normal zeichnest und dann das andere Bild mittels Scanlines hineinblendest. Also nur einen bestimmten Bereich berechnen. Und dieses Bild kannst du dann auf dein Formular zeichnen. Achte aber darauf, dass du es nur neu berechnest, wenn sich auch etwas getan hat.

Für den Fall, dass du es nicht selber machen möchtest solltest du dir mal die Graphics32 [http://www.g32.org/] anschauen. Ich denke mal, dass du die auch benutzen könntest. Weiß es nicht mehr 100%tig. Wobei ich sagen muss, dass die für deinen simplen Fall wohl ein wenig überfrachtet sind.


F34r0fTh3D4rk - Di 04.10.05 10:39

wenn dahinter eh noch ein Timage liegt, warum zeichnest du dann nicht beide bilder in ein Timage ?


Alstar - Di 04.10.05 12:24

Könnte ich machen, allerdings müsste ich mir dafür selbst Code für das Blenden zusammenfriemeln 8)

Alstar


MathiasH - Di 04.10.05 15:57

Mit den GDI/GDI+ Funktionen musst du das nicht selbst machen und einigermaßen schnell sind sie auch (natürlich ist OpenGL etc noch schneller).

Handgemacht ist es aber auch nicht so schwierig, mit Scanline das Bild durchgehen (muss nichtmal TImage sein, hauptsache TBitmap und dann einfach in die Zielbitmap (vorzugsweise ein anderes) übertragen. 50% Transparenz heißt z.B.

Quelltext
1:
 ZPixel.rot = (APixel.rot + BPixel.rot)/2; // Pseudocode                    


fertig eigentlich net so schwer, oder?