Page 1 sur 1
[R] Enregistrement image provenant du presse papier
Posté : jeu. 22 avr. 2010 14:20
par scorp84
Bonjour à tous,
Je reviens vers vous pour mon histoire de capture écran...
La seule façon que j'ai trouvée de faire une capture écran complète (on fonctionne en double écran) et d'utiliser la fonction : Send("{PRINTSCREEN}")
Mon problème est le suivant : comment enregistrer l'image contenue dans le presse-papier sur le disque dur après avoir exécuté cette fonction ?
Merci d'avance pour votre aide.
Amicalement.
BM
Re: [..] Enregistrement image provenant du presse papier
Posté : jeu. 22 avr. 2010 14:52
par GaRydelaMer
Re
La réponse ici dans la doc:
#Include <Clipboard.au3>
_ClipBoard_GetData([$iFormat = 1])
Success: Text for text based formats or Binary data for all other formats
@extended is set to the # of characters for Text, or # of bytes for Binary
Pour une image tu vas avoir le contenu du fichier en binaire je pense j'ai pas testé, donc ensuite tu écris directement les données binaires dans un fichier.
Re: [..] Enregistrement image provenant du presse papier
Posté : jeu. 22 avr. 2010 15:34
par scorp84
C'est bien ça mon problème
En fait j'avais trouvé :
Code : Tout sélectionner
$hBitmap=_ClipBoard_GetData ($CF_BITMAP)
MsgBox(0,"test",$hBitmap & @LF & @LF & @error)
_ScreenCapture_SaveImage($bug_rep & "\" & $bug_img, $hBitmap)
Mais il me sort un code erreur à -4 et je n'arrive pas à trouver la correspondance de ce code
As tu une idée d'où peut venir mon erreur ?
Merci encore
Amicalement.
BM
Re: [..] Enregistrement image provenant du presse papier
Posté : jeu. 22 avr. 2010 16:11
par scorp84
...
GaRydelaMer : J'ai essayé de suivre ton conseil et de mettre le tout dans un fichier :
Code : Tout sélectionner
Send("{PRINTSCREEN}")
$hBitmap=_ClipBoard_GetData ($CF_BITMAP)
FileOpen($bug_rep & "\" & $bug_img,2)
FileWrite ($bug_rep & "\" & $bug_img,$hBitmap)
FileClose($bug_rep & "\" & $bug_img)
Mais il me dit que le format n'est pas correct.
Si j'ouvre le fichier avec le bloc note, il contient "0".
Je me plante quelque part mais je ne trouve pas où
Merci d'avance pour votre aide à tous
Amicalement.
BM
Re: [..] Enregistrement image provenant du presse papier
Posté : jeu. 22 avr. 2010 16:49
par ani
Re: [..] Enregistrement image provenant du presse papier
Posté : jeu. 22 avr. 2010 16:53
par scorp84
Salut Ani !
Merci pour l'info
Je regarde ça de suite.
Amicalement.
BM
Re: [..] Enregistrement image provenant du presse papier
Posté : jeu. 22 avr. 2010 17:04
par scorp84
Ani : En fait c'est le contraire de _ImageToClip que je cherche à faire.
Il faut que l'image qui est dans le presse-papier soit enregistrée en tant qu'image sur le disque dur.
Je continue à chercher
Merci pour ton aide.
Amicalement.
BM
Re: [..] Enregistrement image provenant du presse papier
Posté : jeu. 22 avr. 2010 17:24
par ani
ok
donc en reprenant ton exemple
► Afficher le texte
Code : Tout sélectionner
#include <Clipboard.au3>
#include <Memory.au3>
Send("{PRINTSCREEN}")
$hImage = _ClipBoard_GetData($CF_BITMAP)
;C'est ici le plus important !!
$hBinaryBitmap = _ClipBoard_GetData($CF_DIB)
; on récupere la taille du binaire
$nImageSize = _MemGlobalSize($hBinaryBitmap)
MsgBox(0, '', "Taille de l'image : " & $nImageSize & ' Bytes')
$pImageBytes = _MemGlobalLock($hBinaryBitmap)
;
Local $str = Binary("BM") & StringTrimLeft(Binary($nImageSize + 14), 2) & "0000000036000000"
;Structure
$sImageBuffer = DllStructCreate('byte[' & $nImageSize & ']')
$pImageBuffer = DllStructGetPtr($sImageBuffer)
_MemMoveMemory($pImageBytes, $pImageBuffer, $nImageSize)
_MemGlobalUnlock($hImage)
$bBinaryToWrite = $str & StringTrimLeft(DllStructGetData($sImageBuffer, 1), 2)
Local $hSaveFile = FileOpen(@ScriptDir & "\ScreenBitmap.bmp", 26)
FileWrite($hSaveFile, $bBinaryToWrite)
FileClose($hSaveFile)
Exit
bonne continuation

Re: [..] Enregistrement image provenant du presse papier
Posté : jeu. 22 avr. 2010 17:56
par GaRydelaMer
Merci Ani
j'etais aussi partis sur le forum Anglais et trouvé comme toi les fonctions de copy d'image vers le clipBoard.
Mais tu as fait plus vite que moi et j'en etais pas encore la ou tu es passé.
Re: [..] Enregistrement image provenant du presse papier
Posté : ven. 23 avr. 2010 11:00
par scorp84
Super !
Merci à tous les 2 pour votre aide précieuse et super rapide
Ani :
Quand j'exécute ta fonction et que l'image est créée la taille de l'image est à 0 (msgbox) et quand j'essaye d'ouvrir l'image, Windows me sort que l'image est endommagée ou corrompue
Est ce que le fait que je sois sous Vista puisse y changer quelque chose ?
Amicalement.
BM
Re: [..] Enregistrement image provenant du presse papier
Posté : sam. 24 avr. 2010 15:18
par ani
je ne peut répondre sur ce sujet (no vista),
mais peut-être en rajoutant #requireAdmin ?
Re: [..] Enregistrement image provenant du presse papier
Posté : lun. 26 avr. 2010 13:44
par scorp84
Bonjour,
Ani : j'ai essayé ton code sous XP et j'ai le même souci : la taille de l'image est à 0.
J'ai pourtant fait la mise à jour d'Autoit via "Check For Updates" et j'ai maintenant la version 3.3.6.1.
Ce qui est bizarre, c'est qu'avant, j'utilisais ce bout de code :
► Afficher le texte
Code : Tout sélectionner
Send("{PRINTSCREEN}")
$hGUI=GUICreate("WW")
_ClipBoard_Open ($hGUI)
$presse_papier=ClipGet()
if @error = 2 Then
$hBitmap=_ClipBoard_GetData ($CF_BITMAP)
_ScreenCapture_SaveImage($bug_rep & "\" & $bug_img, $hBitmap)
EndIf
J'étais en version 3.3.0.0 et cela marchait nickel. Depuis que je suis passé dans la dernière version, cela ne fonctionne plus
Tlem m'avait dit dans un autre post que ma syntaxe de _ScreenCapture_SaveImage n'était pas bonne. Mais tant que ça fonctionnait, je ne m'en était pas inquiété. j'ai essayé de la changer par rapport à la doc mais elle ne fonctionne toujours plus.
Je suis dans une impasse et je suis em##dé car j'en ai besoin pour mon boulot et du coup, plus rien ne marche
Pour ton code Ani, j'ai essayé sur 3 postes (2 sous XP et un sous vista) et même pour le dernier avec #requireAdmin, ça ne marche pas
Merci d'avance ++ à celui ou celle qui m'aidera à me sortir de ce problème
Amicalement.
BM
Re: [..] Enregistrement image provenant du presse papier
Posté : mar. 27 avr. 2010 05:26
par ani
Exact, mais ayant testé avec la v3.2.12.1 (qui fonctionne) ^^'
je viend de visionner, que çà soit l'include où même l'aide, y a pas mal de changement, donc dure dure .
D'apr!s l'aide pour récuperer les bytes (taille) du binaire faut utiliser @extended
Donc j'avais testé çà, il retournee bien la valeur (taille) mit en mémoire par l'image dans le clipboard,...
Code : Tout sélectionner
$hbinary....
if @error then return seterror(1,0,0)
$nSize = @extended
$hData = _MemGlobalAlloc($nSize)
$nImageSize = _MemGlobalSize($hData)
ConsoleWrite("Taille de l'image : " & $nImageSize & ' Bytes' & @CRLF)
$pImageBytes = _MemGlobalLock($hData)
......
pour l'écriture bein là je bloque

POUQUOI autant de changement grrrrrrrr
Alors ? mais vlà la soluce

SI tu tourne sous vista faudra pas oublier de rajouter #RequireAdmin
Résolution du probleme = ouvrir la fonction ouverture clipboard et d'utiliser la fonction GetDataEx au lei de GetData
► Afficher le texte
Code : Tout sélectionner
#include <Clipboard.au3>
#include <Memory.au3>
;nvoie de la Touche Imprime écran
Send("{PRINTSCREEN}")
; Ouverture du Presse papier
[color=#FF0000]_ClipBoard_Open(0)[/color]
; C'est ici le plus important !!
; $CF_DIB - structure BITMAPINFO
$hBinaryBitmap = _[color=#FF0000]ClipBoard_GetDataEx[/color]($CF_DIB)
; On vérifie si y a pas d'erreur
If @error Then SetError(1,0,0)
; On bloque en mémoire l'information du presse papier
$pImageBytes = _MemGlobalLock($hBinaryBitmap)
; on récupere la taille mit en mémoire par le presse papier
$nImageSize = _MemGlobalSize($hBinaryBitmap)
; On affiche la taille en bytes
ConsoleWrite("Taille de l'image : " & $nImageSize & ' Bytes')
; Création de l'entête du fichier (le header) *.bmp
Local $str = Binary("BM") & StringTrimLeft(Binary($nImageSize + 14), 2) & "0000000036000000"
; Création d'une Structure tampon pour stocker la taille vers le pointer $hBinaryBitmap
$sImageBuffer = DllStructCreate('byte[' & $nImageSize & ']'[color=#FF0000],$hBinaryBitmap[/color])
$pImageBuffer = DllStructGetPtr($sImageBuffer)
;on envoie la capture (ce qui a été bloqué) vers la structure avec sa taille
_MemMoveMemory($pImageBytes, $pImageBuffer, $nImageSize)
; on débloque de la mémoire l'information du presse papier
_MemGlobalUnlock($hBinaryBitmap)
; Fermeture du Presse papier
_ClipBoard_Close()
;IMAGE_Binaire
$bBinaryToWrite = $str & StringTrimLeft(DllStructGetData($sImageBuffer, 1), 2)
Local $hSaveFile = FileOpen("c:\ScreenBitmap.bmp", 26)
FileWrite($hSaveFile, $bBinaryToWrite)
FileClose($hSaveFile)
Exit
voilàvoilà
bonne continuation et bonne lecture de la v3.3.6 .*

Re: [..] Enregistrement image provenant du presse papier
Posté : mar. 27 avr. 2010 14:03
par scorp84
Ouf !
Merci Ani pour ton aide. t'es trop fort
Je commençais à devenir fou car mon script marchait sur une machine (qui était en 3.3.0.0) et pas sur les 2 autres. J'essayais de faire des modifs mais qui ne faisaient qu'empirer les choses et au final, plus rien ne fonctionnait
Mais maintenant grâce à toi tout est rentré dans l'ordre.
Je vais le réintrégrer dans mon script initial (avec envoi par email du compte rendu des applis qui tournent, du nom machine, utilisateur, adresses IP, adresse MAC, ...) je le mettrai en partage sur le forum.
Merci pour tout le temps passé à m'aider, que ce soit toi ou les autres.
Amicalement.
BM
Re: [R] Enregistrement image provenant du presse papier
Posté : mar. 27 avr. 2010 14:20
par ani
En faite l'erreur provenait du clipgetdata si on lui demandé si la valeur retourné est égal à zero (en cas d'erreur, rien dans le presse papier), il le retourné

voilàvoilà, rien de bizarre $_$"
tu peux aussi réduire la taille du screen (poids)
Exemple chez moi le fichier (screenshot) fait quand même 3Mo (pour le format *bmp) en 1024*768, le mieux serai *png non çà reviendrai à ± 150 ko (20fois moins) ?
la faudra passer par GDI surement
je teste 3/4 lignes pour convertir bmp => png
bonne continuation pour ton projet
Re: [R] Enregistrement image provenant du presse papier
Posté : mar. 27 avr. 2010 16:20
par scorp84
Sans vouloir abuser, je suis preneur si tu trouves pour le PNG
Merci encore ++
Amicalement.
BM
Re: [R] Enregistrement image provenant du presse papier
Posté : mar. 27 avr. 2010 19:15
par ani
ok pour le moment je relis l'aide et les includes donc
Pour revenir au sujet soit on utilise l'exemple fournit plus haut,
plus complexe mais bon

ou tout simplement avec la fonction _ClipBoard_GetData
Exemple
► Afficher le texte
Code : Tout sélectionner
#include <Clipboard.au3>
Send("{PRINTSCREEN}")
; $CF_DIB - structure BITMAPINFO suivi de bit par l
; hBinaryBitmap = binaire hexadecimal
$hBinaryBitmap = _ClipBoard_GetData($CF_DIB)
Local $nSize = @extended ; taille du fichier
; On affiche la taille en bytes
ConsoleWrite("Taille de l'image : " & $nSize & ' Bytes' & @cr)
; Création de l'entête du fichier (le header)*.bmp
Local $str = Binary("BM") & StringTrimLeft(Binary($nSize + 14), 2) & "0000000036000000"
;Ecriture du fichier
FileWriteLine("c:\ScreenShot.bmp",binary($str & Hex($hBinaryBitmap)))
voilàvoilà
pour la conversion, je pense que le clipboard par defaut c'est bmp
je part a la recherche de l'entete *png
Sur c'est avec _GDIPLUS_ mais bon
