Seite 1 von 1

Overlay mehrerer Bilder

Verfasst: 05.02.2016 17:54
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??

Re: Overlay mehrerer Bilder

Verfasst: 05.02.2016 18:10
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.

Re: Overlay mehrerer Bilder

Verfasst: 05.02.2016 18:53
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

Re: Overlay mehrerer Bilder

Verfasst: 06.02.2016 05:40
von Sven
Sollte man sowas nicht besser mit AlphaChannel machen?