Dreiecke aus Bild schneiden

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Benutzeravatar
dige
Beiträge: 1182
Registriert: 08.09.2004 08:53

Dreiecke aus Bild schneiden

Beitrag von dige »

Habt Ihr schon mal das Problem gehabt, spezielle Formen aus einem Bild auszuschneiden?
Momentan geht es um folgende Dreiecke:

Bild

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?
"Papa, mein Wecker funktioniert nicht! Der weckert immer zu früh."
Benutzeravatar
dige
Beiträge: 1182
Registriert: 08.09.2004 08:53

Re: Dreiecke aus Bild schneiden

Beitrag von dige »

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?
"Papa, mein Wecker funktioniert nicht! Der weckert immer zu früh."
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: Dreiecke aus Bild schneiden

Beitrag von Danilo »

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.

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
Auf Mac OS X funktioniert das allerdings so nicht (Bug). CustomFilterCallback mit Draw(Alpha)Image geht da auch nicht (Bug).
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
dige
Beiträge: 1182
Registriert: 08.09.2004 08:53

Re: Dreiecke aus Bild schneiden

Beitrag von dige »

@Danilo: Danke! Das funktioniert Prima. Jetzt brauch ich noch eine Funktion die mir ein Dreieck zeichnet.
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
Nur wie kann ich damit auf dem Alpha Kanal zeichnen?
"Papa, mein Wecker funktioniert nicht! Der weckert immer zu früh."
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6996
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Dreiecke aus Bild schneiden

Beitrag von STARGÅTE »

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
Benutzeravatar
dige
Beiträge: 1182
Registriert: 08.09.2004 08:53

Re: Dreiecke aus Bild schneiden

Beitrag von dige »

@Stargate: Danke. Kannst du mir bitte mit der Schwerpunktformel noch helfen?

Reicht da?:

Code: Alles auswählen

FillArea( (x1 + x2 + x3)/3, (y1 + y2 + y3)/3, #White, #White)
Edit:
Laut Wikipedia (http://de.wikipedia.org/wiki/Geometrisc ... kt#Dreieck) ja ...
"Papa, mein Wecker funktioniert nicht! Der weckert immer zu früh."
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6996
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Dreiecke aus Bild schneiden

Beitrag von STARGÅTE »

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
Antworten