Page 1 sur 1

[R] Mettre une image JPG dans la presse-papier

Posté : jeu. 14 oct. 2010 13:13
par Ahbadiane
Bonjour,

J'essaye de faire passer une image au format JPG dans le presse-papier avec le code suivant

Code : Tout sélectionner

#include <ClipBoard.au3>
#include <GDIPlus.au3>

Global $scNomCompletImage = "C:\Image.JPG"

_GDIPlus_Startup()
Global $hImage = _GDIPlus_ImageLoadFromFile($scNomCompletImage)
Global $hBmp = _WinAPI_CreateBitmap(_GDIPlus_ImageGetWidth($hImage), _GDIPlus_ImageGetHeight($hImage), 1, 32)
Global $hBitmap = _GDIPlus_BitmapCreateFromHBITMAP($hBmp)
Global $hData = _ClipBoard_SetData($hBitmap, $CF_BITMAP)

ConsoleWrite('$hData = ' & $hData & @crlf)

_GDIPlus_BitmapDispose($hBitmap)
_GDIPlus_GraphicsDispose($hImage)
_GDIPlus_Shutdown()
 
Au final, le presse-papier ne contient pas l'image (et $hData=0)
Un problème de Handle, de format ???
Si vous avez une piste, une idée je prends

Re: [..] Mettre une image JPG dans la presse-papier

Posté : sam. 16 oct. 2010 09:42
par Ahbadiane
Bonjour,

J'ai progressé un peu.
Je passe maintenant une image, mais totalement noir, dans le presse-papier avec la bonne taille.
(Je recopie même l'image initiale en utilisant son Handle)

Code : Tout sélectionner

#include <ClipBoard.au3>
#include <GDIPlus.au3>

Global $scNomCompletImage = @ScriptDir & "\Image.jpg"

_GDIPlus_Startup()
Global $hImage = _GDIPlus_ImageLoadFromFile($scNomCompletImage) ; => Handle to the image object
Global $hGraphic = _GDIPlus_ImageGetGraphicsContext($hImage) ; => Handle to a Graphics object
Global $hBmp = _WinAPI_CreateBitmap(_GDIPlus_ImageGetWidth($hImage), _GDIPlus_ImageGetHeight($hImage), 1, 32) ; The handle to a bitmap
Global $hBitmap = _GDIPlus_BitmapCreateFromHBITMAP($hBmp)

_GDIPlus_ImageSaveToFile ($hImage, @ScriptDir & "\Image2.jpg")
_ClipBoard_Open("")
_ClipBoard_Empty()
Global $hData = _ClipBoard_SetDataEx($hBmp, $CF_BITMAP)
_ClipBoard_Close()
ConsoleWrite('$hData = ' & $hData & @crlf)

_GDIPlus_BitmapDispose($hBitmap)
_GDIPlus_GraphicsDispose($hImage)
_GDIPlus_Shutdown()
Je ne dois pas être loin de la solution mais il me manque encore un petit peu quelque chose ... un peu d'aide

Re: [..] Mettre une image JPG dans la presse-papier

Posté : jeu. 04 nov. 2010 15:03
par Ahbadiane
Bonjour,

Je relance une dernière fois.
J'ai fait des recherches sur les autres sites (même allemand sans comprendre un mot !) mais pas de solution trouvée
Si quelqu'un a une suggestion, un début de piste, je prends

Re: [..] Mettre une image JPG dans la presse-papier

Posté : jeu. 04 nov. 2010 17:36
par bloodwolff
Le problème vien surement du hbitmap envoyé car ce script fonctionne très bien avec une capture d'écran

Code : Tout sélectionner

#include <ClipBoard.au3>
#include <GDIPlus.au3>
#Include <ScreenCapture.au3>


_GDIPlus_Startup() 
 $hBitmap = _ScreenCapture_Capture("")
_ClipBoard_Open("")
_ClipBoard_Empty()
 _ClipBoard_SetDataEx($hImage, $CF_BITMAP)
_ClipBoard_Close()
_GDIPlus_BitmapDispose($hBitmap)
_GDIPlus_Shutdown()

Re: [..] Mettre une image JPG dans la presse-papier

Posté : jeu. 04 nov. 2010 20:13
par Ahbadiane
Bonjour bloodwolff,

Merci pour ton aide :)

Je pense que le problème vient bien de $hbitmap
Mais le Handle est obtenu par : $hBitmap = _GDIPlus_BitmapCreateFromHBITMAP($hBmp) et je ne vois pas comment faire autrement. :?:

$hBmp est, lui, correct car _GDIPlus_ImageSaveToFile($hImage, @ScriptDir & "\Image2.jpg") crée bien image2.jpg

Re: [..] Mettre une image JPG dans la presse-papier

Posté : jeu. 04 nov. 2010 22:13
par bloodwolff
j'ai tenter plusieurs choses mais j'abandonne , je ne comprend pas pourquoi avec un screen cela fontionne mais qu'avec cette fonction ... rien
_GDIPlus_BitmapCreateFromFile($sFileName)
J'espère que quelqu'un résoudra ton problème car je suis curieux d'en savoir la solution

Re: [..] Mettre une image JPG dans la presse-papier

Posté : jeu. 04 nov. 2010 22:21
par scorp84
Bonjour Ahbadiane,

Voici un exemple qui fonctionne :

Code : Tout sélectionner

#include <ScreenCapture.au3>

Local $hGUI

; Create GUI
$hGUI = GUICreate("Screen Capture", @DesktopWidth, @DesktopHeight)

; Capture window
_ScreenCapture_CaptureWnd ("GDIPlus_Image.jpg", $hGUI)
 
Je l'ai trouvé sur :
http://www.autoitscript.com/autoit3/doc ... ureWnd.htm

J'espère qu'il pourra t'aider.

Amicalement.

BM

Re: [..] Mettre une image JPG dans la presse-papier

Posté : jeu. 04 nov. 2010 22:22
par bloodwolff
Je doute fort que ce sois ce qu'il cherche à faire ... tu as bien lu le post et tester le script ?

Re: [..] Mettre une image JPG dans la presse-papier

Posté : jeu. 04 nov. 2010 22:25
par scorp84
@ bloodwolff :

Ce n'est peut être pas LA solution mais peut être que ça pourra l'aider.

A+

BM

Re: [..] Mettre une image JPG dans la presse-papier

Posté : jeu. 04 nov. 2010 23:13
par bloodwolff
Oui mais je ne vois pas en quoi cela peut l'aider .
Il demande comment mettre une image jpeg dans le presse papier et tu lui donne une fonction qui prend une capture de l'écran qui peut même être réduit à
_ScreenCapture_Capture ("GDIPlus_Image.jpg")

Re: [..] Mettre une image JPG dans la presse-papier

Posté : ven. 05 nov. 2010 20:18
par Ahbadiane
bonsoir,
Merci à scorp84 et à bloodwolff
Oui la question est bien de passer une image (peut importe le format jpg, png, ...) dans le presse-papier et je n'ai pas trouvé la solution :!:

Re: [..] Mettre une image JPG dans la presse-papier

Posté : ven. 05 nov. 2010 20:33
par Jerome
Coucou,


Peut - être que tu devrait regarder du côté du logiciel ZabGrab, je m'en sert pour faire des imprim écran soit de zone, soit de tout l'écran, et sa copie directement le tout dans le presse papier.




Jérôme

Re: [..] Mettre une image JPG dans la presse-papier

Posté : ven. 05 nov. 2010 20:56
par Ahbadiane
Jerome,

Cette fonction de copie d'une image dans le presse-papier est un élément d'une appli que je suis en train de développer. Et j'essaie de reconstituer une image mémorisée dans SQlite vers le presse-papier. Une image qui a été capturée précédemment.
Sinon pour la capture d'écran ou partie d'écran j'utilise PicPick

Re: [..] Mettre une image JPG dans la presse-papier

Posté : sam. 06 nov. 2010 01:22
par Tlem
J'ai cherché un bon moment aussi, mais je pense qu'il faut faire appel à une/des structures pour utiliser directement _ClipBoard_SetDataEx.

Sinon, j'ai bricolé ça, mais bon, c'est pas top non plus ...
► Afficher le texte

Re: [..] Mettre une image JPG dans la presse-papier

Posté : sam. 06 nov. 2010 03:15
par bloodwolff
Oui j'y avais pensé mais sa ne reste pas très optimale comme méthode et les screen diminue un peu la qualité de l'image , mais au moins c'est la seule méthode qui fonctionne :?

Re: [..] Mettre une image JPG dans la presse-papier

Posté : sam. 06 nov. 2010 16:13
par Ahbadiane
Bonjour,

Merci Tlem pour cette solution
Je reste tout de même un peu sur ma faim
Je ne mets pas le sujet à résolu, j'espère trouver une solution par moi-même ou par un gentil membre du forum

Re: [..] Mettre une image JPG dans la presse-papier

Posté : sam. 06 nov. 2010 18:09
par Tlem
Je epnse que c'est tout à fait possible, mais ici comme sur le forum Anglais, personne n’a encore donné la solution.
Peut être que le sujet Anglais devrait être relancé ... :roll:

Re: [..] Mettre une image JPG dans la presse-papier

Posté : lun. 08 nov. 2010 17:55
par Ahbadiane
Bonjour,

J'ai la solution :D suite un post sur le forum anglais
Voici le code

Code : Tout sélectionner

#include <ClipBoard.au3>
#include <Constants.au3>
#include <GDIPlus.au3>
#Include <WinAPI.au3>

Global $sImageName = FileOpenDialog("Select an image", "", "Image (*.bmp;*.jpg;*.png;*.gif)")
If @error Then Exit

_GDIPlus_Startup ()
$hImage = _GDIPlus_ImageLoadFromFile($sImageName)
$hBmp = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
$hBitmap = _WinAPI_CopyImage($hBmp, 0, 0, 0, $LR_COPYDELETEORG + $LR_COPYRETURNORG)

_ClipBoard_Open(0)
_ClipBoard_Empty()
_ClipBoard_SetDataEx($hBitmap, $CF_BITMAP)
_ClipBoard_Close()
_GDIPlus_ImageDispose($hImage)
_GDIPlus_Shutdown()

MsgBox(0, "Copy to Clipboard", "Successfully bitmap copied to clipboard!", 10)


;===============================================================================
;
; Function Name:   _WinAPI_CopyImage
; Description:: Copies an image, also makes GDIPlus-HBITMAP to GDI32-BITMAP
; Parameter(s): $hImg -> HBITMAP Object, GDI or GDIPlus
; Requirement(s):  WinAPI.au3
; Return Value(s): Succes: Handle to new Bitmap, Error: 0
; Author(s):    Prog@ndy
; http://www.autoitscript.com/forum/topic/...images-and-the-clipboard/page_
;===============================================================================
Func _WinAPI_CopyImage($hImg, $uType = 0 ,$x = 0, $y = 0, $flags = 0)
    Local $aResult

    $aResult = DllCall("User32.dll", "hwnd", "CopyImage", "hwnd", $hImg, "UINT", $uType, "int", $x, "int", $y,"UINT", $flags)
    Return $aResult[0]
EndFunc   ;==>_WinAPI_CopyIcon