Overlay mehrerer Bilder

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Benutzeravatar
7x7
Beiträge: 591
Registriert: 14.08.2007 15:41
Computerausstattung: ganz toll
Wohnort: Lelbach

Overlay mehrerer Bilder

Beitrag von 7x7 »

Hallo Leute,

ich habe es immer vor mir her geschoben, weil ich mich noch nie damit beschäftigt habe, aber jetzt MUSS es sein.

Folgendes Problem:
Ich möchte 3 (oder mehrere) Bilder übereinander legen (wie transparente Folien bei einem Overhead-Projektor) und das Gesamtbild anzeigen lassen. Aber OHNE Farbmischung! D.h, das letzte Bild hat immer Priorität vor dem darunterliegenden. In unten stehenden Beispiel soll also eine rote Box auf einem gelben Keis auf schwarzem Hintergrund erscheinen.

Nach allerlei Versuchen bin ich zu keinem Ergebnis gekommen. Da bin ich zu blöd dazu. Ich verstehe es einfach nicht. Das "Handbuch" ist für mich nicht zu gebrauchen, da verstricke ich mich in ein Durcheinander von Abhängigkeiten und Sonderfälle das nicht mehr durchschaubar ist. Die wenigen Beispiele verwirren eher als zu helfen.

Der untenstehende Code war schon um einiges länger, aber wie gesagt: Erfolglos. Alles wieder auf Anfang gesetzt. Vielleicht kann es mir irgendwer von euch erklären was ich tun muss.

Code: Alles auswählen

xscreen=700
yscreen=700

Enumeration
	#Bild0
	#Bild1
	#Bild2
	#Bild3
EndEnumeration

#ColorHintergrund	=$000000	;schwarz
#Kreis				=$FFFF00	;Gelb
#Box				=$000099	;Rot


CreateImage(#Bild0,xscreen,yscreen)

CreateImage(#Bild1,xscreen,yscreen)
StartDrawing(ImageOutput(#Bild1))
Box(0,0,xscreen,yscreen,#ColorHintergrund)
StopDrawing()

CreateImage(#Bild2,xscreen,yscreen)
StartDrawing(ImageOutput(#Bild2))
Circle(xscreen/2,yscreen/2,xscreen/2,#Kreis)
StopDrawing()

CreateImage(#Bild3,xscreen,yscreen)
StartDrawing(ImageOutput(#Bild3))
Box(300,300,300,300,#Box)
StopDrawing()

;------------------------------------------------------
OpenWindow(0,100,100,xscreen,yscreen,"", #PB_Window_SystemMenu)
ImageGadget(1,0,0,xscreen,yscreen,0)

StartDrawing(ImageOutput(#Bild0))
DrawImage(ImageID(#Bild1),0,0)
DrawImage(ImageID(#Bild2),0,0)
;DrawImage(ImageID(#Bild3),0,0)
StopDrawing()
ImageGadget(1,0,0,xscreen,yscreen,ImageID(#Bild0))

Repeat
	Event = WaitWindowEvent()
Until Event = #PB_Event_CloseWindow
Mir ist auch nicht klar, wann ich die ImageID() statt nur der #Konstante verwenden muss (siehe z.B. ImageOutput() vs.DrawImage()). Meine Absicht ist doch durch Verwendung der Konstanten für den Compiler eindeutig erkennbar! Warum kann DAS der Compiler bei Bedarf nicht selbst erledigen??
- alles was ich hier im Forum sage/schreibe ist lediglich meine Meinung und keine Tatsachenbehauptung
- unkommentierter Quellcode = unqualifizierter Müll
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Overlay mehrerer Bilder

Beitrag von RSBasic »

7x7 hat geschrieben:Mir ist auch nicht klar, wann ich die ImageID() statt nur der #Konstante verwenden muss (siehe z.B. ImageOutput() vs.DrawImage()).
Eigentlich ist das ganz einfach. Wenn in der Parameterliste "#Image" abgefragt wird, dann braucht er auch die Konstante bzw. nur die Image-Nummer. Ansonsten bei "ImageID" braucht er natürlich ImageID().
Kommt drauf an, welche Funktion du verwenden möchtest. Manche brauchen nur die einfache Image-Nummer von PB und manche die Handle-Nummer (ImageID).
Es wäre natürlich besser gewesen, wenn man es von Anfang an einheitlicher gemacht hätte. D.h. alle Funktionen benötigen nur die einfache PB-Nummer und nicht mal so und mal so. Bei WinAPI kann ich das ja nachvollziehen. Dort braucht man immer die Handle-Nummer.
Alternativ kann man ja Macros erstellen und Funktionen wie DrawImage() einheitlicher machen, so dass man ausschließlich die normale Nummer übergibt.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Overlay mehrerer Bilder

Beitrag von mk-soft »

Mit "CustomFilterCallback(@FilterCallback())" geht das sehr gut. Dazu verwendet man am besten eine Filterfarbe wie Lila.
Diese wird dann nicht im Ziel überschrieben.

Code: Alles auswählen

xscreen=700
yscreen=700

Enumeration
   #Bild0
   #Bild1
   #Bild2
   #Bild3
EndEnumeration

#ColorFilter = $FF00FF ; lila
#ColorHintergrund   =$000000   ;schwarz
#Kreis            =$FFFF00   ;Gelb
#Box            =$000099   ;Rot


Procedure FilterCallback(x, y, QuellFarbe, ZielFarbe)
  
  If QuellFarbe & $FFFFFF = #ColorFilter
    ProcedureReturn ZielFarbe
  Else
    ProcedureReturn QuellFarbe
  EndIf
EndProcedure


CreateImage(#Bild0,xscreen,yscreen)

CreateImage(#Bild1,xscreen,yscreen)
StartDrawing(ImageOutput(#Bild1))
Box(0,0,xscreen,yscreen,#ColorFilter)
Box(10,10,xscreen-10,yscreen-10,#ColorHintergrund)
StopDrawing()

CreateImage(#Bild2,xscreen,yscreen)
StartDrawing(ImageOutput(#Bild2))
Box(0,0,xscreen,yscreen,#ColorFilter)
Circle(xscreen/2,yscreen/2,xscreen/2,#Kreis)
StopDrawing()

CreateImage(#Bild3,xscreen,yscreen)
StartDrawing(ImageOutput(#Bild3))
Box(0,0,xscreen,yscreen,#ColorFilter)
Box(300,300,300,300,#Box)
StopDrawing()

;------------------------------------------------------
OpenWindow(0,100,100,xscreen,yscreen,"", #PB_Window_SystemMenu)
ImageGadget(1,0,0,xscreen,yscreen,0)

StartDrawing(ImageOutput(#Bild0))

CustomFilterCallback(@FilterCallback())

DrawingMode(#PB_2DDrawing_CustomFilter)      
DrawImage(ImageID(#Bild1),0,0)
DrawImage(ImageID(#Bild2),0,0)
DrawImage(ImageID(#Bild3),0,0)
DrawingMode(#PB_2DDrawing_Default)      

StopDrawing()
ImageGadget(1,0,0,xscreen,yscreen,ImageID(#Bild0))

Repeat
   Event = WaitWindowEvent()
Until Event = #PB_Event_CloseWindow
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Sven
Beiträge: 374
Registriert: 23.09.2004 12:01

Re: Overlay mehrerer Bilder

Beitrag von Sven »

Sollte man sowas nicht besser mit AlphaChannel machen?
Antworten