Bilder transparent darstellen?

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

Jean

Betreff: Bilder transparent darstellen?

BeitragSo, März 05, 2006 15:07
Antworten mit Zitat
Benutzer-Profile anzeigen
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? Rolling Eyes

Vielen Dank
 

Dreamora

BeitragSo, März 05, 2006 15:08
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, März 05, 2006 15:14
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, März 05, 2006 15:36
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, März 05, 2006 17:58
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Very Happy Das ganze in Echtzeit, 3D fähige Grafikkarte vorausgesetzt Very Happy
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...

Jean

BeitragSo, März 05, 2006 19:36
Antworten mit Zitat
Benutzer-Profile anzeigen
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

Kabelbinder

Sieger des WM-Contest 2006

BeitragMi, März 08, 2006 22:33
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, März 08, 2006 23:24
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, März 09, 2006 12:57
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Smile Manchmal flackerts aber ein bisschen, fuer kleinere Objekte sollte es aber reichen Smile

Hummelpups

BeitragDo, März 09, 2006 17:41
Antworten mit Zitat
Benutzer-Profile anzeigen
@Dreamora: Wenn der Alphawert 255 oder 1 ist, ist das obejkt voll
Sichtbar, ist es 0 ist es durchsichtig Wink

IMurDOOM
blucode - webdesign - Ressource - NetzwerkSim
BlitzBasic 2D - BlitzMax - MaxGUI - Monkey - BlitzPlus
 

Dreamora

BeitragDo, März 09, 2006 18:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Dann halt umgekehrt Wink (also das (1-alpha) vorne und alpha hinten). Sagte ja was in die richtung Wink
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Jean

BeitragFr, März 10, 2006 20:38
Antworten mit Zitat
Benutzer-Profile anzeigen
@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

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group