Autor |
Beitrag |
Alstar
      
Beiträge: 827
|
Verfasst: Mo 03.10.05 00:09
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
      
Beiträge: 1383
Erhaltene Danke: 1
WinXP
D2005 PE
|
Verfasst: Mo 03.10.05 00:14
Eine möglichkeit wäre dir PNGImage zu installieren und transparente PNGs zu verwenden.
|
|
Alstar 
      
Beiträge: 827
|
Verfasst: 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
      

Beiträge: 5248
Erhaltene Danke: 2
WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
|
Verfasst: Mo 03.10.05 08:07
Du könntest theoretisch DelphiX dafür verwenden.
DelphiX hat eine AlphaBlend-Funktion.
_________________ "Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
|
|
Alstar 
      
Beiträge: 827
|
Verfasst: Mo 03.10.05 11:37
Nein. Bitte kein DirectX oder OpenGL. Ich möchte ganz einfach nur eine Art TImage mit Alphablending
Alstar
|
|
MrSaint
      
Beiträge: 1033
Erhaltene Danke: 1
WinXP Pro SP2
Delphi 6 Prof.
|
Verfasst: 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:
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]); r := (RGB and $0000FF); g := (RGB and $00FF00) shr 8; b := (RGB and $FF0000) shr 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
_________________ "people knew how to write small, efficient programs [...], a skill that has subsequently been lost"
Andrew S. Tanenbaum - Modern Operating Systems
|
|
Alstar 
      
Beiträge: 827
|
Verfasst: 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 
      
Beiträge: 827
|
Verfasst: 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
Alstar
|
|
MathiasH
      
Beiträge: 699
WinXP, Win98SE, Debian, Win95
D5 Stand, D6 Prof
|
Verfasst: Mo 03.10.05 22:23
Hallo
Mit einem TImage kann ich zwar nicht dienen, aber was hältst du davon:
msdn.microsoft.com/l...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
_________________ "Viel von sich reden, kann auch ein Mittel sein, sich zu verbergen."
Friedrich Nietzsche
|
|
Alstar 
      
Beiträge: 827
|
Verfasst: 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
      
Beiträge: 1048
Erhaltene Danke: 4
|
Verfasst: 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 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.
_________________ Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
|
|
F34r0fTh3D4rk
      
Beiträge: 5284
Erhaltene Danke: 27
Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
|
Verfasst: Di 04.10.05 10:39
wenn dahinter eh noch ein Timage liegt, warum zeichnest du dann nicht beide bilder in ein Timage ?
|
|
Alstar 
      
Beiträge: 827
|
Verfasst: Di 04.10.05 12:24
Könnte ich machen, allerdings müsste ich mir dafür selbst Code für das Blenden zusammenfriemeln
Alstar
|
|
MathiasH
      
Beiträge: 699
WinXP, Win98SE, Debian, Win95
D5 Stand, D6 Prof
|
Verfasst: 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?
_________________ "Viel von sich reden, kann auch ein Mittel sein, sich zu verbergen."
Friedrich Nietzsche
|
|