Seite 1 von 1

[Gelöst] 2D Drawing auf ImageGadget funktioniert nicht

Verfasst: 06.01.2013 22:35
von MenschMarkus
Hallo,

Ich wollte auf ein geladenes Bild eine 2D Grafik zeichnen. Leider erscheint da nichts.
Kann mir da jemand helfen?
Hier mal ein Beispielcode

Code: Alles auswählen

Enumeration
    #Window
    #ImgGadget
    #Image
EndEnumeration

Procedure Open_Window()
    OpenWindow(#Window,10,10,300,300,"Draw on image")
    ImageGadget(#ImgGadget,0,0,300,300,#Image)
EndProcedure

Open_Window()

strTMP.s = OpenFileRequester("Bild Laden","*.bmp","Bitmap (*.bmp)|*.bmp",0)
LoadImage(#Image,strTMP.s)
SetGadgetState(#ImgGadget,ImageID(#Image)) ; schreibe Bild ins ImageGadget

StartDrawing(ImageOutput(#Image)) ; Definiere Image als Ausgabeziel
Box(10,10,30,30,$ff0000) ; Zeichne einen blauen Kasten
StopDrawing()

Repeat
    Select WaitWindowEvent()
        Case #PB_Event_CloseWindow
            End
    EndSelect
ForEver
Nachtrag:
Wird das Fenster aus dem Bildschirmbereich herausbewegt und wieder zurück bewegt, ist urplötzlich die blaue Box da

2. Nachtrag
Lösung steht hier im Forum
Danke Danilo

Code: Alles auswählen

Enumeration
    #Window
    #ImgGadget
    #Image
EndEnumeration

Procedure Open_Window()
OpenWindow(#Window,10,10,300,300,"Draw on image")
ImageGadget(#ImgGadget,0,0,300,300,#Image)
EndProcedure

Procedure RedrawWindow(hWin)
  If hWin
    InvalidateRect_(hWin,0,1)
    UpdateWindow_(hWin)
  EndIf
EndProcedure
Open_Window()

strTMP.s = OpenFileRequester("Bild Laden","*.bmp","Bitmap (*.bmp)|*.bmp",0)
LoadImage(#Image,strTMP.s)
SetGadgetState(#ImgGadget,ImageID(#Image))

StartDrawing(ImageOutput(#Image))
Box(10,10,30,30,$ff0000)
StopDrawing()
RedrawWindow(GadgetID(#ImgGadget))

Repeat
    Select WaitWindowEvent()
        Case #PB_Event_CloseWindow
            End
    EndSelect
ForEver

Re: [Gelöst] 2D Drawing auf ImageGadget funktioniert nicht

Verfasst: 07.01.2013 15:08
von bobobo
Die Frage ist doch schon falsch gestellt. Du malst nie auf ein Imagegadget
sondern auf ein Image oder Window oder Screen oder oder (siehe startdrawing() in der PB-Hilfe)

im übrigen geht das auch einfacher (und was wichtiger ist) ganz ohne API (stromsparender ist es auch :mrgreen: )

Code: Alles auswählen

Enumeration
    #Window
    #ImgGadget
    #Image
EndEnumeration

Procedure Open_Window()
    OpenWindow(#Window,10,10,300,300,"Draw on image")
    ImageGadget(#ImgGadget,0,0,300,300,#Image)
EndProcedure

Open_Window()

strTMP.s = OpenFileRequester("Bild Laden","*.bmp","Bitmap (*.bmp)|*.bmp",0)
LoadImage(#Image,strTMP.s)

StartDrawing(ImageOutput(#Image)) ; Definiere Image als Ausgabeziel
Box(10,10,30,30,$ff0000) ; Zeichne einen blauen Kasten
StopDrawing()
;das Bild ist fertig (die blaue Box ist drübergemalt) und kann ins Imagegadget gesetzt werden
SetGadgetState(#ImgGadget,ImageID(#Image)) ; schreibe Bild ins ImageGadget

Repeat
    Select WaitWindowEvent()
        Case #PB_Event_CloseWindow
            End
    EndSelect
ForEver
Bei variablen reingemichelten Boxen kannst Du das geladene Bild zwischenspeichern
und eine Kopie davon immer wieder neu bemale.

Code: Alles auswählen

Enumeration
    #Window
    #ImgGadget
    #Image
    #ImageCopy
EndEnumeration
Procedure malemal()
  CopyImage(#Image,#ImageCopy)
  RandomSeed(ElapsedMilliseconds())
  StartDrawing(ImageOutput(#ImageCopy)) ; Definiere Image als Ausgabeziel
    Box(10,10,30,30,RGB(Random(64),Random(64),Random(128)+128)) ; Zeichne einen blauen Kasten
  StopDrawing()
  SetGadgetState(#ImgGadget,ImageID(#ImageCopy)) ; schreibe Bild ins ImageGadget
EndProcedure

Procedure Open_Window()
    OpenWindow(#Window,10,10,300,300,"Draw on image")
    ImageGadget(#ImgGadget,0,0,300,300,#Image)
EndProcedure

Open_Window()

strTMP.s = OpenFileRequester("Bild Laden","*.bmp","Bitmap (*.bmp)|*.bmp",0)
LoadImage(#Image,strTMP.s)
malemal()
Repeat
  Select WaitWindowEvent(250)
    Case #PB_Event_CloseWindow
      End
    Default
      malemal()      
  EndSelect
ForEver

Re: [Gelöst] 2D Drawing auf ImageGadget funktioniert nicht

Verfasst: 08.01.2013 00:14
von MenschMarkus
Das ist nett :D
Vielen Dank für die Alternativlösungen