Page 1 sur 1

canvas et image : ne s'actualise pas

Publié : dim. 10/mai/2015 10:08
par blendman
salut

J'ai un bug que je ne comprends pas (pourtant, j'ai cherché, mais je dois être endormi ^^).

Je dessine sur un canvas et en même temps sur mon image (mon calque), puis, j'update mon canvas en dessinant le layer dessus, et paf rien ne s'affiche.
J'ai tenté d'afficher ce layer sur un imagegadget() et pareil, rien ne s'affiche.
Pourtant lorsque je sauve mon layer, l'image est bien remplie de points...

Si vous avez une idée du pourquoi que ça bug ce bidule :), je suis preneur.

Code :

Code : Tout sélectionner

;{ infos
; Modified by blendman : 05/2015
; PB 5.22LTS (marche sur 5.30 )
;}

;{ enumeration
Enumeration ; gadgets  
  #Imagegadget
  #canvas    
  ; tools
  #G_PanelTool
  #G_Preview  
  ; layer
  #G_PanelLayer
  #G_LayerList   
EndEnumeration

Enumeration ; menu  
  ; file
  #Menu_Export
  #menu_Exit  
  ; edition
  #menu_Clear  
EndEnumeration

Enumeration ; image  
  #ImageExport
  #ImagePreview  
EndEnumeration
;}

;{ structures
Structure sLayer
  Image.i
EndStructure
Global Dim Layer.sLayer(0)
;}


;{ Variables 
Global  x, y, LayerId.i
;}


;{ procedure

Procedure UpdateCanvas()
    
  If StartDrawing(CanvasOutput(#canvas))
    
    Box(0,0,1500,1500,RGBA(220,220,220,255))
    
    DrawingMode(#PB_2DDrawing_AlphaBlend)
    ;For i=1 To ArraySize(layer())
        ; DrawAlphaImage(layer(i)\Image,0,0,255)
    ;Next i
    
    DrawAlphaImage(layer(LayerId)\Image,0,0,255) ; <---------------- bug :(
    
    StopDrawing()
  
  EndIf
  
EndProcedure


; Layers
Procedure LayerUpdateList()
  
  n = ArraySize(layer())
  AddGadgetItem(#G_LayerList,-1,"Layer"+Str(n))
  
EndProcedure

Procedure LayerAdd()
  
  n = ArraySize(layer())
  ReDim layer(n+1)
  
  W = GadgetWidth(#canvas)
  H = GadgetHeight(#canvas)
  With layer(n+1)
    \Image = CreateImage(#PB_Any,w,h,32,#PB_Image_Transparent)
    LayerId = n+1
  EndWith
  
  LayerUpdateList()
    
EndProcedure

;}


If UsePNGImageDecoder() And UsePNGImageEncoder()
EndIf

      
    ExamineDesktops()
    winw = DesktopWidth(0)
    winh = DesktopHeight(0)
    
    OpenWindow(0,0,0,winw,winh,"Painting Tablet",#PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_MaximizeGadget|#PB_Window_Maximize)
        
    If CreateMenu(0,WindowID(0))
      MenuTitle("File")      
      MenuItem(#Menu_Export,"Export layer Image"+Chr(9)+"Ctrl+E")
      MenuBar()
      MenuItem(#Menu_Exit,"Exit"+Chr(9)+"Escape")  
      MenuTitle("Edit")
      MenuItem(#Menu_clear,"Clear"+Chr(9)+"Ctrl+W")
      
      AddKeyboardShortcut(0,#PB_Shortcut_E|#PB_Shortcut_Control,#Menu_Export)
      AddKeyboardShortcut(0,#PB_Shortcut_W|#PB_Shortcut_Control,#menu_Clear)
      AddKeyboardShortcut(0,#PB_Shortcut_Escape,#menu_Exit)
    EndIf
  
    
    ;{ gadgets & images
    
    w = WindowWidth(0)-150
    h = WindowHeight(0)-25
    canvasW = w-300
    canvasH = h-25-80
    canvasX = 200
    
     ;{ images
    CreateImage(#ImageExport,CanvasW,CanvasH,32, #PB_Image_Transparent)
    CreateImage(#ImagePreview,150,100,32, #PB_Image_Transparent)
      ;}
    
    ; panel tool
    If PanelGadget(#G_PanelTool, 5,0,170,h-25)      
      AddGadgetItem(#G_PanelTool,0,"Tools")            
      ImageGadget(#G_Preview,5,30,140,100,ImageID(#ImagePreview),#PB_Image_Border)      
      CloseGadgetList()
    EndIf
      
    CanvasGadget(#canvas,canvasX,25,canvasW,CanvasH)
    SetGadgetAttribute(#canvas,#PB_Canvas_Cursor,#PB_Cursor_Cross)

    ; panel layer
    If PanelGadget(#G_PanelLayer, canvasX+w-280,0,200,h-25)      
      AddGadgetItem(#G_PanelLayer,0,"Layers")
      ListViewGadget(#G_LayerList, 10,50,180,200)            
      CloseGadgetList()
   EndIf
    ;}
    
    LayerAdd()

  
    
    Repeat
      
      Select WaitWindowEvent(20)
          
        Case #PB_Event_CloseWindow
          
          Break
          
        Case #PB_Event_Menu
          
          Select EventMenu()
              
            Case #Menu_clear              
              If StartDrawing(ImageOutput(layer(LayerId)\image))
                DrawingMode(#PB_2DDrawing_AlphaChannel)
                Box(0,0,canvasW,canvasH,RGBA(0,0,0,0))
                StopDrawing()
              EndIf
              UpdateCanvas()
           
              
            Case #Menu_Export
              filename$ = SaveFileRequester("Save Image","","png|*.png",0)
              If filename$ <>""
                If GetExtensionPart(filename$) <> "png"
                  filename$ + ".png"
                EndIf                
                SaveImage(Layer(LayerId)\image, filename$,#PB_ImagePlugin_PNG)
              EndIf
                          
            Case #Menu_Exit
              Break
              
          EndSelect
          
        Case #PB_Event_Gadget
          
          Select EventGadget()
                            
            ;{ layers
          Case #G_LayerList            
            LayerId = GetGadgetState(#G_LayerList)+1
            Debug layerId
            Debug Layer(LayerId)\Image
            Updatecanvas()            
            ;}
              
            ;{ canvas  
            Case #canvas
              
              EventType = EventType()
              
              If EventType = #PB_EventType_LeftButtonDown
                MouseDown  = #True
                
                
              ElseIf EventType = #PB_EventType_LeftButtonUp
                MouseDown = #False
                Updatecanvas()
               
                If StartDrawing(ImageOutput(#ImagePreview))
                  Debug "update preview"
                  DrawingMode(#PB_2DDrawing_AlphaBlend)
                  Box(0,0,200,200,RGBA(255,255,255,255)) ; ok
                  ;Debug layerID
                  ;Debug layer(LayerId)\image
                  DrawAlphaImage(Layer(LayerId)\image,0,0,255) ; <-------------- ne marche pas ???
                  StopDrawing()                 
                EndIf
                
                SetGadgetState(#G_Preview,ImageID(#imagePreview))
                ; SetGadgetState(#G_Preview,ImageID(layer(LayerId)\Image)) ; ok
                
              ElseIf EventType = #PB_EventType_MouseMove 
                
                If MouseDown 
                  xx = GetGadgetAttribute(#canvas,#PB_Canvas_MouseX)
                  yy = GetGadgetAttribute(#canvas,#PB_Canvas_MouseY)
                  
                  If StartDrawing(CanvasOutput(#canvas)) ; dessin sur le canvas
                    
                    DrawingMode(#PB_2DDrawing_AlphaBlend)
                    Circle(xx, yy,10,RGBA(0,0,0,255))
                    StopDrawing()  
                    
                  EndIf
                 
                  
                  If StartDrawing(ImageOutput(layer(LayerId)\image)) ; on dessin sur le layer

                    DrawingMode(#PB_2DDrawing_AlphaBlend)
                    Circle(xx, yy, 10,RGBA(0,0,0,255))
                    StopDrawing()
                  
                  EndIf
                                    
                  ;UpdateCanvas()
                  
                EndIf
              EndIf
              ;}
                            
          EndSelect
          
      EndSelect
      
    ForEver
    

Re: canvas et image : ne s'actualise pas

Publié : dim. 10/mai/2015 11:56
par G-Rom
Salut BlendMan
utilise imageID() pour l'id de l'image.
j'ai viré aussi ta Box() quand tu refresh le canvas , ca marche :

Code : Tout sélectionner

;{ infos
; Modified by blendman : 05/2015
; PB 5.22LTS (marche sur 5.30 )
;}

;{ enumeration
Enumeration ; gadgets  
  #Imagegadget
  #canvas    
  ; tools
  #G_PanelTool
  #G_Preview  
  ; layer
  #G_PanelLayer
  #G_LayerList   
EndEnumeration

Enumeration ; menu  
  ; file
  #Menu_Export
  #menu_Exit  
  ; edition
  #menu_Clear  
EndEnumeration

Enumeration ; image  
  #ImageExport
  #ImagePreview  
EndEnumeration
;}

;{ structures
Structure sLayer
  Image.i
EndStructure
Global Dim Layer.sLayer(0)
;}


;{ Variables 
Global  x, y, LayerId.i
;}


;{ procedure

Procedure UpdateCanvas()
    
  If StartDrawing(CanvasOutput(#canvas))
    
    ;Box(0,0,1500,1500,RGBA(220,220,220,255))
    
    DrawingMode(#PB_2DDrawing_AlphaBlend)
    ;For i=1 To ArraySize(layer())
        ; DrawAlphaImage(layer(i)\Image,0,0,255)
    ;Next i
    If IsImage(layer(LayerId)\Image)
      DrawAlphaImage(ImageID(layer(LayerId)\Image),0,0,255) ; <---------------- bug :(
    EndIf 
    
    StopDrawing()
  
  EndIf
  
EndProcedure


; Layers
Procedure LayerUpdateList()
  
  n = ArraySize(layer())
  AddGadgetItem(#G_LayerList,-1,"Layer"+Str(n))
  
EndProcedure

Procedure LayerAdd()
  
  n = ArraySize(layer())
  ReDim layer(n+1)
  
  W = GadgetWidth(#canvas)
  H = GadgetHeight(#canvas)
  With layer(n+1)
    \Image = CreateImage(#PB_Any,w,h,32,#PB_Image_Transparent)
    LayerId = n+1
  EndWith
  
  LayerUpdateList()
    
EndProcedure

;}


If UsePNGImageDecoder() And UsePNGImageEncoder()
EndIf

      
    ExamineDesktops()
    winw = DesktopWidth(0)
    winh = DesktopHeight(0)
    
    OpenWindow(0,0,0,winw,winh,"Painting Tablet",#PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_MaximizeGadget|#PB_Window_Maximize)
        
    If CreateMenu(0,WindowID(0))
      MenuTitle("File")      
      MenuItem(#Menu_Export,"Export layer Image"+Chr(9)+"Ctrl+E")
      MenuBar()
      MenuItem(#Menu_Exit,"Exit"+Chr(9)+"Escape")  
      MenuTitle("Edit")
      MenuItem(#Menu_clear,"Clear"+Chr(9)+"Ctrl+W")
      
      AddKeyboardShortcut(0,#PB_Shortcut_E|#PB_Shortcut_Control,#Menu_Export)
      AddKeyboardShortcut(0,#PB_Shortcut_W|#PB_Shortcut_Control,#menu_Clear)
      AddKeyboardShortcut(0,#PB_Shortcut_Escape,#menu_Exit)
    EndIf
  
    
    ;{ gadgets & images
    
    w = WindowWidth(0)-150
    h = WindowHeight(0)-25
    canvasW = w-300
    canvasH = h-25-80
    canvasX = 200
    
     ;{ images
    CreateImage(#ImageExport,CanvasW,CanvasH,32, #PB_Image_Transparent)
    CreateImage(#ImagePreview,150,100,32, #PB_Image_Transparent)
      ;}
    
    ; panel tool
    If PanelGadget(#G_PanelTool, 5,0,170,h-25)      
      AddGadgetItem(#G_PanelTool,0,"Tools")            
      ImageGadget(#G_Preview,5,30,140,100,ImageID(#ImagePreview),#PB_Image_Border)      
      CloseGadgetList()
    EndIf
      
    CanvasGadget(#canvas,canvasX,25,canvasW,CanvasH)
    SetGadgetAttribute(#canvas,#PB_Canvas_Cursor,#PB_Cursor_Cross)

    ; panel layer
    If PanelGadget(#G_PanelLayer, canvasX+w-280,0,200,h-25)      
      AddGadgetItem(#G_PanelLayer,0,"Layers")
      ListViewGadget(#G_LayerList, 10,50,180,200)            
      CloseGadgetList()
   EndIf
    ;}
    
    LayerAdd()

  
    
    Repeat
      
      Select WaitWindowEvent(20)
          
        Case #PB_Event_CloseWindow
          
          Break
          
        Case #PB_Event_Menu
          
          Select EventMenu()
              
            Case #Menu_clear              
              If StartDrawing(ImageOutput(layer(LayerId)\image))
                DrawingMode(#PB_2DDrawing_AlphaChannel)
                Box(0,0,canvasW,canvasH,RGBA(0,0,0,0))
                StopDrawing()
              EndIf
              UpdateCanvas()
           
              
            Case #Menu_Export
              filename$ = SaveFileRequester("Save Image","","png|*.png",0)
              If filename$ <>""
                If GetExtensionPart(filename$) <> "png"
                  filename$ + ".png"
                EndIf                
                SaveImage(Layer(LayerId)\image, filename$,#PB_ImagePlugin_PNG)
              EndIf
                          
            Case #Menu_Exit
              Break
              
          EndSelect
          
        Case #PB_Event_Gadget
          
          Select EventGadget()
                            
            ;{ layers
          Case #G_LayerList            
            LayerId = GetGadgetState(#G_LayerList)+1
            Debug layerId
            Debug Layer(LayerId)\Image
            Updatecanvas()            
            ;}
              
            ;{ canvas  
            Case #canvas
              
              EventType = EventType()
              
              If EventType = #PB_EventType_LeftButtonDown
                MouseDown  = #True
                
                
              ElseIf EventType = #PB_EventType_LeftButtonUp
                MouseDown = #False
                Updatecanvas()
               
                If StartDrawing(ImageOutput(#ImagePreview))
                  Debug "update preview"
                  DrawingMode(#PB_2DDrawing_AlphaBlend)
                  Box(0,0,200,200,RGBA(255,255,255,255)) ; ok
                  ;Debug layerID
                  ;Debug layer(LayerId)\image
                  DrawAlphaImage(ImageID(Layer(LayerId)\image),0,0,255) ; <-------------- ne marche pas ???
                  StopDrawing()                 
                EndIf
                
                SetGadgetState(#G_Preview,ImageID(#imagePreview))
                ; SetGadgetState(#G_Preview,ImageID(layer(LayerId)\Image)) ; ok
                
              ElseIf EventType = #PB_EventType_MouseMove 
                
                If MouseDown 
                  xx = GetGadgetAttribute(#canvas,#PB_Canvas_MouseX)
                  yy = GetGadgetAttribute(#canvas,#PB_Canvas_MouseY)
                  
                  If StartDrawing(CanvasOutput(#canvas)) ; dessin sur le canvas
                    
                    DrawingMode(#PB_2DDrawing_AlphaBlend)
                    Circle(xx, yy,10,RGBA(0,0,0,255))
                    StopDrawing()  
                    
                  EndIf
                 
                  
                  If StartDrawing(ImageOutput(layer(LayerId)\image)) ; on dessin sur le layer

                    DrawingMode(#PB_2DDrawing_AlphaBlend)
                    Circle(xx, yy, 10,RGBA(0,0,0,255))
                    StopDrawing()
                  
                  EndIf
                                    
                  ;UpdateCanvas()
                  
                EndIf
              EndIf
              ;}
                            
          EndSelect
          
      EndSelect
      
    ForEver
   

Re: canvas et image : ne s'actualise pas

Publié : dim. 10/mai/2015 15:13
par blendman
ah oui, l'imageID(), quel plouc je suis, c'est pas possible ^^.
C'était pourtant tout simple, merci encore ;).