Bilder transparent darstellen?
Übersicht

![]() |
JeanBetreff: Bilder transparent darstellen? |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo Zusammen
Ich suche für mein Projekt eine Funktion mit der es möglich ist Bilder transparent darzustellen. Also ich meine nicht den Befehl MaskImage sondern ich möchte den Hintergrund durch das Bild "durchschimmern" lassen. Gibt es da schon vorgefertigte funktionen oder muss ich das selbst berechnen? ![]() Vielen Dank |
||
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Musst du selbst berechnen. Transparenz ist nur bei Texturen (3D Befehle) möglich.
Es sollte jedoch im CodeArchiv eine Funktion haben für 2D Bilder. |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
![]() |
Jean |
![]() Antworten mit Zitat ![]() |
---|---|---|
Danke! Wie kann ich sowas mit den Farbwerten berechnen? Ich muss ja sowas wie ein Zwischenwert finden... darf ich da die Farbanteile (rgb) mit den Farbwerten vom Hintergrund addieren und danach das ganze durch 2 dividieren?
Also: rot = (rot_hintergrund + rot_bild) / 2 gruen = (gruen_hintergrund + gruen_bild) / 2 blau = (blau_hintergrund + blau_bild) / 2 Geht das so? |
||
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Eher in der Art von
Eher in der Art von ; Alpha# ist der Wert fürs durchschimmern neu_gruen = hintergrund_gruen * alpha + bild_alpha * (1.0-alpha) ... (oder wars umgekehrt. Weiss es jetzt grad nimmer) Das ganze ist natürlich nicht sonderlich schnell, weil du es für alle Pixel von "bild" machen musst und sollte darum nicht mit grösseren bildern gemacht werden. Gibt jedoch glaub auch eine Userlib die Alpha bei Bildern erlaubt, dies würde jedoch BlitzPlus oder Blitz3D voraussetzen. Das sollte schneller sein. |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
![]() |
Hubsi |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wenn Du Blitz3D hast und es geht Dir nur um einen oder mehrere Effekte kannst Du auch mit Sprites arbeiten. Ein kleines Beispiel wie mans machen könnte (Als zip gepackt weil Grafiken dabei sind)
http://freepasting.chat-blitz....amp;id=163 Mit den Cursortasten hoch/runter läßt sich die Transparenz verstellen, mit wenigen Funktionen läßt sich auch das Sprite drehen und skalieren ![]() ![]() |
||
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn... |
![]() |
Jean |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich hab jetzt mal selbst versucht das Problem zu lösen, aber es scheint nicht richtig zu funktionieren... könnte mir jemand die Funktion so umschreiben, dass ich noch einen Alpha Wert vergeben kann?
Code: [AUSKLAPPEN] Graphics 800, 600 hin_bild=LoadImage ("hin.bmp") ;Hintergrund laden bild_bild = LoadImage ("janware.bmp") ;Bild laden Dim bild (ImageWidth (bild_bild), ImageHeight (bild_bild)) ;Arrays für Funktion deklarieren Dim hin (ImageWidth (bild_bild), ImageHeight (bild_bild)) Repeat zeit1 = MilliSecs () ;Zeitwert für FPS DrawImage hin_bild, 0, 0 ;Hintergrund zeichnen DrawImageTransparent (bild_bild, MouseX(), MouseY(), 0, 0, 0, 80) ;Transparentese Bild zeichnen zeit2 = MilliSecs () ;FPS berechnen zeit = zeit2 - zeit1 fps = 1000 / zeit Text 0, 0, "FPS: "+ fps Flip Until KeyHit(1)=1 Function DrawImageTransparent (bild_bild, x, y, mask_r, mask_g, mask_b, alpha) LockBuffer BackBuffer() ;Die Pixel vom aktuellen Hintergrund auslesen in ein Array For xx = 0 To ImageWidth (bild_bild) For yy = 0 To ImageHeight (bild_bild) hin (xx,yy) =ReadPixelFast(xx + x,yy + y,FrontBuffer()) Next Next UnlockBuffer BackBuffer() LockBuffer ImageBuffer (bild_bild) ;Die Pixel vom Bild auslesen in ein Array For xx = 0 To ImageWidth (bild_bild) For yy = 0 To ImageHeight (bild_bild) bild (xx,yy) =ReadPixelFast(xx,yy,ImageBuffer (bild_bild)) Next Next UnlockBuffer ImageBuffer (bild_bild) For xx = 0 To ImageWidth (bild_bild) For yy = 0 To ImageHeight (bild_bild) hin_r=(hin (xx,yy) And $FF0000)/$10000 ;Farbcode ind RGB umwandeln hin_g=(hin (xx,yy) And $FF00)/$100 hin_b=hin (xx,yy) And $FF bild_r=(bild (xx,yy) And $FF0000)/$10000 bild_g=(bild (xx,yy) And $FF00)/$100 bild_b=bild (xx,yy) And $FF If bild_r = mask_r And bild_g = mask_g And bild_b = mask_b Then ;Mask Farbe auslassen Else neu_r = (hin_r + bild_r) / 2 ;Neue RGB Werte berechnen neu_g = (hin_g + bild_r) / 2 neu_b = (hin_b + bild_r) / 2 rgb=a*$1000000 + neu_r*$10000 + neu_g*$100 + neu_b ;Neue RGB Werte in Farbcode umwandeln rgb2=rgb And $FFFFFF WritePixelFast x + xx, y + yy, rgb2, BackBuffer() ;Pixel in den BackBuffer schreiben EndIf Next Next End Function P.S. Erscheinen bei euch auch so schwarze Pixel unter dem Kreis? Vielen Dank Jean |
||
![]() |
KabelbinderSieger des WM-Contest 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wenn du eine hohe Auflösung einstellst, kannst du die bilder auch einfach Rastern. Also einfach jeden zweiten Pixel in der Mask-Farbe zeichnen, so Schachbrett ähnlich:
10101010101010101010 01010101010101010101 10101010101010101010 01010101010101010101 10101010101010101010 01010101010101010101 Man merkt so keinen Unterschied. wenn du ein Programm brauchst, dass die Bilder für dich so bearbeitet (von Hand ist das ein bisschen mühsam), Hier: https://www.blitzforum.de/view...ght=raster |
||
<Wing Avenger Download> ◊◊◊ <Macrophage Download> |
![]() |
Triton |
![]() Antworten mit Zitat ![]() |
---|---|---|
https://www.blitzforum.de/viewtopic.php?t=14366
...wenns mit der eigenen Routine nicht klappen sollte. |
||
Coding: silizium-net.de | Portfolio: Triton.ch.vu |
![]() |
DerHase |
![]() Antworten mit Zitat ![]() |
---|---|---|
Bei Kabelbinders Version wuerde ich das Raster bei jedem Frame invertieren. Also einmal
01010 10101 01010 und beim naechsten Frame 10101 01010 10101 Dies liefert ganz akzeptable Ergebnisse und ist vorallem schnell wenn man es richtig macht ![]() ![]() |
||
![]() |
Hummelpups |
![]() Antworten mit Zitat ![]() |
---|---|---|
@Dreamora: Wenn der Alphawert 255 oder 1 ist, ist das obejkt voll
Sichtbar, ist es 0 ist es durchsichtig ![]() IMurDOOM |
||
blucode - webdesign - Ressource - NetzwerkSim
BlitzBasic 2D - BlitzMax - MaxGUI - Monkey - BlitzPlus |
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Dann halt umgekehrt ![]() ![]() |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
![]() |
Jean |
![]() Antworten mit Zitat ![]() |
---|---|---|
@Triton: Vielen Dank! Dein Script ist genial! Ich habe nur noch eine Mask Farbe hinzugefügt:
Code: [AUSKLAPPEN] Graphics 800,600
SetBuffer BackBuffer() Dim alphaimage(GraphicsWidth (),GraphicsHeight ()) ;Array wird in der Funktion benötigt! bild=LoadImage("janware.bmp") bg=LoadImage("hin.bmp") While Not KeyDown(1) DrawBlock(bg,0,0) drawalphaimage(bild,MouseX(),MouseY(),50,0,0,0) Flip Cls Wend Function drawalphaimage(pic,x,y,a,mask_r,mask_g,mask_b) ;a=0(transp)-100(deckend),mask_x=Farbmaske If a <= 0 Then Return SetBuffer ImageBuffer(pic) ;einlesen des Bildes LockBuffer ImageBuffer(pic) For scanx = 0 To ImageWidth(pic)-1 For scany= 0 To ImageHeight(pic)-1 alphaimage(scanx,scany)=ReadPixelFast(scanx,scany) Next Next UnlockBuffer ImageBuffer(pic) SetBuffer BackBuffer() ; auslesen des Hintergrundes und LockBuffer BackBuffer() ; mischen und malen der neuen Pixel For scanx = 0 To ImageWidth(pic)-1 For scany= 0 To ImageHeight(pic)-1 rgb2=ReadPixelFast(scanx+x,scany+y) rbg=(rgb2 And $FF0000)/$10000 gbg=(rgb2 And $FF00)/$100 bbg=rgb2 And $FF rpic=(alphaimage(scanx,scany) And $FF0000)/$10000 gpic=(alphaimage(scanx,scany) And $FF00)/$100 bpic=alphaimage(scanx,scany) And $FF If Not rpic = mask_r And gpic = mask_g And bpic = mask_b rneu=rbg*(1.0-(a/100.0))+rpic*a/100.0 gneu=gbg*(1.0-(a/100.0))+gpic*a/100.0 bneu=bbg*(1.0-(a/100.0))+bpic*a/100.0 rgbneu=255*$1000000 + rneu*$10000 + gneu*$100 + bneu WritePixelFast(scanx+x,scany+y,rgbneu) EndIf Next Next UnlockBuffer BackBuffer() End Function |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group