Habt Ihr schon mal das Problem gehabt, spezielle Formen aus einem Bild auszuschneiden?
Momentan geht es um folgende Dreiecke:
Meine Idee wäre, zunächst das passende Rechteck zu grabben und dann per Linien
die Flächen, die nicht benötigt werden "wegzuradieren".
Geht das auch einfacher?
Dreiecke aus Bild schneiden
Dreiecke aus Bild schneiden
"Papa, mein Wecker funktioniert nicht! Der weckert immer zu früh."
Re: Dreiecke aus Bild schneiden
Jetzt habe ich noch eine andere Idee, kann sie aber mangels unfähigkeit nicht umsetzen.
Kann man eine Fläche oder ein Polygon definieren und dann mittels CustomFilterCallback()
und DrawImage() das Bild zeichnen lassen und jeden Punkt prüfen, ob er in oder ausserhalb
der Fläche liegt?
Wäre eigentlich eine smarte Lösung. Nur wie eine Dreieckfläche definieren?
Kann man eine Fläche oder ein Polygon definieren und dann mittels CustomFilterCallback()
und DrawImage() das Bild zeichnen lassen und jeden Punkt prüfen, ob er in oder ausserhalb
der Fläche liegt?
Wäre eigentlich eine smarte Lösung. Nur wie eine Dreieckfläche definieren?
"Papa, mein Wecker funktioniert nicht! Der weckert immer zu früh."
Re: Dreiecke aus Bild schneiden
Wenn Du Masken dafür nimmst, geht es mit beliebigen Formen. Du hast ein original Bild und ein Bild welches die Form (Dreieck etc.)
im AlphaChannel hat. Daraus erstellst Du ein Drittes Bild, wobei nur die Pixel aus dem originalen Bild übernommen werden, für die in der Maske
der AlphaChannel gesetzt ist.
Kann man bei PB mit DrawingMode(#PB_2DDrawing_AlphaClip) machen.
Auf Mac OS X funktioniert das allerdings so nicht (Bug). CustomFilterCallback mit Draw(Alpha)Image geht da auch nicht (Bug).
im AlphaChannel hat. Daraus erstellst Du ein Drittes Bild, wobei nur die Pixel aus dem originalen Bild übernommen werden, für die in der Maske
der AlphaChannel gesetzt ist.
Kann man bei PB mit DrawingMode(#PB_2DDrawing_AlphaClip) machen.
Code: Alles auswählen
Procedure Combine()
If StartDrawing( ImageOutput(3) )
DrawingMode(#PB_2DDrawing_AllChannels)
Box(0,0,200,200,RGBA($FF,$FF,$FF,$00))
DrawingMode(#PB_2DDrawing_AlphaChannel)
DrawAlphaImage(ImageID(2),0,0)
DrawingMode(#PB_2DDrawing_AlphaClip)
DrawAlphaImage(ImageID(1),0,0)
StopDrawing()
EndIf
If StartDrawing( CanvasOutput(3) )
Box(0,0,200,200,RGBA($FF,$FF,$FF,$FF))
DrawAlphaImage(ImageID(3),0,0)
StopDrawing()
EndIf
EndProcedure
Procedure Paint()
If GetGadgetAttribute(1, #PB_Canvas_Buttons) & #PB_Canvas_LeftButton
x = GetGadgetAttribute(1, #PB_Canvas_MouseX)
y = GetGadgetAttribute(1, #PB_Canvas_MouseY)
If StartDrawing( ImageOutput(1) )
DrawingMode(#PB_2DDrawing_AlphaBlend)
Circle(x,y,10,RGBA(Random($FF),Random($FF),Random($FF),Random($FF)))
StopDrawing()
EndIf
If StartDrawing( CanvasOutput(1) )
Box(0,0,200,200,RGBA($FF,$FF,$FF,$FF))
DrawAlphaImage(ImageID(1),0,0)
StopDrawing()
EndIf
Combine()
EndIf
EndProcedure
Procedure Mask()
If GetGadgetAttribute(2, #PB_Canvas_Buttons) & #PB_Canvas_LeftButton
x = GetGadgetAttribute(2, #PB_Canvas_MouseX)
y = GetGadgetAttribute(2, #PB_Canvas_MouseY)
If StartDrawing( ImageOutput(2) )
DrawingMode(#PB_2DDrawing_AlphaBlend)
Circle(x,y,5,RGBA($00,$00,$00,$FF))
StopDrawing()
EndIf
If StartDrawing( CanvasOutput(2) )
Box(0,0,200,200,RGBA($FF,$FF,$FF,$FF))
DrawAlphaImage(ImageID(2),0,0)
StopDrawing()
EndIf
Combine()
EndIf
EndProcedure
CreateImage(1,200,200,32,#PB_Image_Transparent)
CreateImage(2,200,200,32,#PB_Image_Transparent)
CreateImage(3,200,200,32,#PB_Image_Transparent)
If OpenWindow(0, 0, 0, 600, 200, "2D Drawing Masked")
CanvasGadget(1, 0 , 0, 200, 200, #PB_Canvas_Border)
BindGadgetEvent(1, @Paint(), #PB_EventType_MouseMove)
CanvasGadget(2, 200, 0, 200, 200, #PB_Canvas_Border)
BindGadgetEvent(2, @Mask(), #PB_EventType_MouseMove)
CanvasGadget(3, 400, 0, 200, 200, #PB_Canvas_Border)
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Re: Dreiecke aus Bild schneiden
@Danilo: Danke! Das funktioniert Prima. Jetzt brauch ich noch eine Funktion die mir ein Dreieck zeichnet.
Dazu habe ich das hier gefunden:
Nur wie kann ich damit auf dem Alpha Kanal zeichnen?
Dazu habe ich das hier gefunden:
Code: Alles auswählen
Procedure Triangle(hdc,x1.l, y1.l, x2.l, y2.l, x3.l, y3.l)
ProcedureReturn Polygon_(hdc, @x1, 3)
EndProcedure
"Papa, mein Wecker funktioniert nicht! Der weckert immer zu früh."
Re: Dreiecke aus Bild schneiden
Einfach drei LineXY() zeichnen und dann mit FillArea am Schwerpunkt füllen.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Re: Dreiecke aus Bild schneiden
@Stargate: Danke. Kannst du mir bitte mit der Schwerpunktformel noch helfen?
Reicht da?:
Edit:
Laut Wikipedia (http://de.wikipedia.org/wiki/Geometrisc ... kt#Dreieck) ja ...
Reicht da?:
Code: Alles auswählen
FillArea( (x1 + x2 + x3)/3, (y1 + y2 + y3)/3, #White, #White)
Laut Wikipedia (http://de.wikipedia.org/wiki/Geometrisc ... kt#Dreieck) ja ...
"Papa, mein Wecker funktioniert nicht! Der weckert immer zu früh."
Re: Dreiecke aus Bild schneiden
Jup genau, wenn du natürlich ein Weißes Dreieck auf anderen Weißen Untergrund machst, funktioniert das Füllen nicht mehr, weil er dann die Randfarbe entdeckt.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr