Seite 1 von 1

Dreiecke aus Bild schneiden

Verfasst: 11.09.2014 08:37
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?

Re: Dreiecke aus Bild schneiden

Verfasst: 11.09.2014 09:00
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?

Re: Dreiecke aus Bild schneiden

Verfasst: 11.09.2014 09:39
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).

Re: Dreiecke aus Bild schneiden

Verfasst: 11.09.2014 11:20
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?

Re: Dreiecke aus Bild schneiden

Verfasst: 11.09.2014 11:58
von STARGÅTE
Einfach drei LineXY() zeichnen und dann mit FillArea am Schwerpunkt füllen.

Re: Dreiecke aus Bild schneiden

Verfasst: 11.09.2014 12:11
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 ...

Re: Dreiecke aus Bild schneiden

Verfasst: 11.09.2014 12:28
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.