Page 1 sur 1

Copier le contenu d'un canvasgadget dans le presse papier

Publié : jeu. 13/juin/2019 15:13
par Philippe_GEORGES
Bonjour

Je souhaite copier le contenu (graphique) du canvasgadget vers le presse papier.

Code : Tout sélectionner

   If EventType()= #PB_EventType_LeftDoubleClick      ; copie presse papier
     SetClipboardImage(#canvas_carte)  
     MessageRequester("Information","Image copiée dans le presse papier");
Toutefois, ça ne semble pas aussi simple....

Quelqu'un a t il une idée ?

Merci d'avance

Re: Copier le contenu d'un canvasgadget dans le presse papie

Publié : jeu. 13/juin/2019 15:27
par falsam
GetGadgetAttribute(toncanvas, #PB_Canvas_Image) donne l'image id de ton canvas

Re: Copier le contenu d'un canvasgadget dans le presse papie

Publié : jeu. 13/juin/2019 15:33
par falsam
Petit code de vérification

Code : Tout sélectionner

;Plan de l'application
Declare Start()
Declare CopyClipboardImage()
Declare Exit()

Start()

Procedure Start()
  Protected font = LoadFont(#PB_Any, "", 30)
  
  OpenWindow(0, 0, 0, 800, 600, "Test", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  
  CanvasGadget(0, 0, 0, 800, 600)
  
  StartDrawing(CanvasOutput(0))
  Box(0, 0, 800, 600, RGB(128, 128, 128))
  
  DrawingMode(#PB_2DDrawing_Transparent)
  DrawingFont(FontID(font))
  DrawText(100, 100, "Test copy image")
  StopDrawing()
   
  
  ;Triggers
  BindGadgetEvent(0, @CopyClipboardImage(), #PB_EventType_RightClick)
  
  BindEvent(#PB_Event_CloseWindow, @Exit())
  
  Repeat : WaitWindowEvent() : ForEver
EndProcedure

Procedure CopyClipboardImage()
  Protected imageId = GetGadgetAttribute(0, #PB_Canvas_Image)
  
  Protected image = CreateImage(#PB_Any, GadgetWidth(0), GadgetHeight(0))
  
  StartDrawing(ImageOutput(image))
    DrawImage(imageId, 0, 0)
  StopDrawing()
  
  SetClipboardImage(image)
  Debug "copie effectuée "
EndProcedure

Procedure Exit()  
  End
EndProcedure

Re: Copier le contenu d'un canvasgadget dans le presse papie

Publié : jeu. 13/juin/2019 15:34
par Philippe_GEORGES
Merci Falsam,

Code : Tout sélectionner

   If EventType()= #PB_EventType_LeftDoubleClick      ; copie presse papier
     GetGadgetAttribute(#canvas_carte, #PB_Canvas_Image)
     
     SetClipboardImage( #PB_Canvas_Image)  
     MessageRequester("Information","Image copiée dans le presse papier");
J'ai procédé de cette façon, mais ça ne marche pas .... :cry:

Si tu as une idée....

Phil

Re: Copier le contenu d'un canvasgadget dans le presse papie

Publié : jeu. 13/juin/2019 15:34
par Ollivier
Bonjour, ceci devrait faire l'affaire :

Code : Tout sélectionner

If StartDrawing(CanvasOutput(CanvasNumero) )
   W = OutputWidth()
   H = OutputHeight()
   Image = GrabDrawingImage(#Pb_Any, 0, 0, W, H)
   StopDrawing()
   SetClipboardImage(Image)
   FreeImage(Image)
EndIf
(Et désolé Falsam : le sujet était vide quand j'ai répondu, bande de TGV !)

Re: Copier le contenu d'un canvasgadget dans le presse papie

Publié : jeu. 13/juin/2019 15:37
par falsam
Philippe_GEORGES a écrit :J'ai procédé de cette façon, mais ça ne marche pas ....

Si tu as une idée....
Voir mon code de vérification
https://www.purebasic.fr/french/viewtop ... 96#p204196

Je récupére bien l'image dans mon logiciel de traitement d'image

Re: Copier le contenu d'un canvasgadget dans le presse papie

Publié : jeu. 13/juin/2019 15:39
par falsam
La solution d'olivier est bonne aussi

Code : Tout sélectionner

;Plan de l'application
Declare Start()
Declare CopyClipboardImage()
Declare Exit()

Start()

Procedure Start()
  Protected font = LoadFont(#PB_Any, "", 30)
  
  OpenWindow(0, 0, 0, 800, 600, "Test", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  
  CanvasGadget(0, 0, 0, 800, 600)
  
  StartDrawing(CanvasOutput(0))
  Box(0, 0, 800, 600, RGB(128, 128, 128))
  
  DrawingMode(#PB_2DDrawing_Transparent)
  DrawingFont(FontID(font))
  DrawText(100, 100, "Test copie image")
  StopDrawing()
   
  
  ;Triggers
  BindGadgetEvent(0, @CopyClipboardImage(), #PB_EventType_RightClick)
  
  BindEvent(#PB_Event_CloseWindow, @Exit())
  
  Repeat : WaitWindowEvent() : ForEver
EndProcedure

Procedure CopyClipboardImage()
  If StartDrawing(CanvasOutput(0) )
    W = OutputWidth()
    H = OutputHeight()
    Image = GrabDrawingImage(#PB_Any, 0, 0, W, H)
    StopDrawing()
    SetClipboardImage(Image)
    FreeImage(Image)
  EndIf 
  Debug "copy effectuée "
EndProcedure

Procedure Exit()  
  End
EndProcedure

Re: Copier le contenu d'un canvasgadget dans le presse papie

Publié : jeu. 13/juin/2019 15:48
par Philippe_GEORGES
Falsam,

Ton message s'est croisé avec le mien !!

ça marche grâce à ton exemple.... Inutile de te dire à quel point je me trouve bête !

Code : Tout sélectionner

   If EventType()= #PB_EventType_LeftDoubleClick      ; copie presse papier
    imageId = GetGadgetAttribute(#canvas_carte, #PB_Canvas_Image)
    image = CreateImage(#PB_Any, GadgetWidth(#canvas_carte), GadgetHeight(#canvas_carte))
    StartDrawing(ImageOutput(image))
    DrawImage(imageId, 0, 0)
    StopDrawing()  
    SetClipboardImage(image)   
    MessageRequester("Information","Image copiée dans le presse papier");
  EndIf
Grand merci de ton aide,

Phil