[..] Inversion de couleur pour une image

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
mystere
Niveau 4
Niveau 4
Messages : 62
Enregistré le : ven. 26 nov. 2010 22:37
Status : Hors ligne

[..] Inversion de couleur pour une image

#1

Message par mystere »

Bonjour, je débute en Autoit, et j’aimerais inverser les couleurs d’une image que je viens de capturer avec Autoit. Par exemple touts les pixels 0xffffff devienne 0x000000, ou bien que le bleu 0x0000ff devienne jaune. Comme sur Word par exemple quand on sélectionne un texte de couleur bleu 0x0000ff on obtient ceci.

Image

J’ai cherché dans les fonctions de Autoit, mais je n’ai rien trouvé qui corresponde a ce que je cherche. Je demande donc s’il n’existe pas une Udf ou une fonction approprié pour faire ce que je voudrai ainsi que pour réalisé tout sa ?

Voici la partie de mon code Autoit qui traite la capture de l’image ainsi que la résolution de l’image.
► Afficher le texte
Modifié en dernier par mystere le ven. 10 déc. 2010 15:01, modifié 2 fois.
Avatar du membre
ayuckers
Niveau 4
Niveau 4
Messages : 77
Enregistré le : mer. 28 oct. 2009 14:15
Localisation : Drome
Status : Hors ligne

Re: [..] Inversion de couleur pour une image

#2

Message par ayuckers »

Bonjour,

Tu devrais trouver ici un exemple pour inverser les couleurs d'une image avec GDI+ :)
http://www.autoitscript.com/forum/topic ... rt-colors/

Autres pistes :

Utiliser ImageMagick en ligne de command :
http://www.imagemagick.org/script/comma ... -tools.php

Un UDF exploitant les fonctionnalitées de ImageMagick :
http://www.autoitscript.com/forum/topic ... ct-object/
mystere
Niveau 4
Niveau 4
Messages : 62
Enregistré le : ven. 26 nov. 2010 22:37
Status : Hors ligne

Re: [..] Inversion de couleur pour une image

#3

Message par mystere »

Merci ayuckers de m’avoir aguillait, je suis passé par GDIplus avec l’exemple du forum anglais, sa fonctionne sans souci dans la gui. Mais je n’arrive pas à sauvegarder la nouvelle image. J’ai pourtant cherché pendant pas malle de temps, mais impossible de savoir pourquoi la nouvelle image ne veut pas ce sauvegarder

Edit : Modification du code voci le code fonctionelle mais avec la gui.
► Afficher le texte
Modifié en dernier par mystere le jeu. 02 déc. 2010 18:25, modifié 2 fois.
mystere
Niveau 4
Niveau 4
Messages : 62
Enregistré le : ven. 26 nov. 2010 22:37
Status : Hors ligne

Re: [..] Inversion de couleur pour une image

#4

Message par mystere »

Bonjour je viens de réussir enfin a enregistré l’image sur le disque dure, mais je bloque encore pour enlevé complètement cette gui qui ne me sert plus pour la suite de mon code. En effet maintenant lorsque je lance le scripte j’ai le message d’erreur de Windows qui dit que ce programme vas fermait avec la fameuse question qui demande si on veut envoyer le rapport ou non.

D’où viens ce problème ?

Voici mon dernier code ou j’ai enlever tout ce qui ce rapportai à la gui. J’ai même traduit une partit des variables pour faire plus propre.
► Afficher le texte
Modifié en dernier par mystere le ven. 10 déc. 2010 15:01, modifié 6 fois.
Avatar du membre
ayuckers
Niveau 4
Niveau 4
Messages : 77
Enregistré le : mer. 28 oct. 2009 14:15
Localisation : Drome
Status : Hors ligne

Re: [..] Inversion de couleur pour une image

#5

Message par ayuckers »

hello,

a tu essayer la fonction GUIDelete juste avant de sortir de ton programme ?
exemple : GUIDelete($handle)
pour moi sa a résolu mon problème.
mystere
Niveau 4
Niveau 4
Messages : 62
Enregistré le : ven. 26 nov. 2010 22:37
Status : Hors ligne

Re: [..] Inversion de couleur pour une image

#6

Message par mystere »

Salut ayuckers, j’ai essayé ce que tu ma dit, mais le scripte bloque encore j’ai ajouté en rouge la modification que tu ma conseillez de faire. Ou est donc le problemme ?
mystere
Niveau 4
Niveau 4
Messages : 62
Enregistré le : ven. 26 nov. 2010 22:37
Status : Hors ligne

Re: [..] Inversion de couleur pour une image

#7

Message par mystere »

Salut, j’ai mis a jour le code avec pas malle de travaille, j’ai réussi a enlevé les boite de dialogue, a incorporé l’inversion de couleur avec la modification de la résolution de l’image.
J’ai mis également au propre le code et j’ai aussi traduit de nombreuse variable en français.

Le code ci dessous est fonctionnel. Cependant je bloque encore pour enlever la gui qui ne me sert a rien. J’ai mis en rouge les 3 lignes qui pose problème et don je ne comprend pas.

Code : Tout sélectionner

#include <WinAPI.au3>
#include <GDIPlus.au3>
#include <GuiConstants.au3>
#include <WindowsConstants.au3>
#Include <ScreenCapture.au3> 
$handle=wingethandle("application") 
_gdiplus_startup()
$image=_screencapture_capturewnd("",$handle,107,10,225,48,false)
$capture=_gdiplus_bitmapcreatefromhbitmap($image)
local $largeur,$hauteur
$largeur=_gdiplus_imagegetwidth($capture)
$hauteur=_gdiplus_imagegetheight($capture)
[color=#FF0000]$hGui=GUICreate("",$largeur,$hauteur)
GUISetState()
$hGraphicGUI=_gdiplus_graphicscreatefromhwnd($hGui)[/color]
$inversion=_gdiplus_bitmapcreatefromgraphics($largeur,$hauteur,$hGraphicGUI)
$hGraphic=_gdiplus_imagegetgraphicscontext($inversion)
_gdiplus_graphicsdrawimage($hGraphic, $capture,0,0)
_gdiplus_graphicsdrawimage($hGraphicGUI, $inversion,0,0)
_gdiplus_graphicsdrawimagerectrecttrans($hGraphic,$inversion,0,0)
_gdiplus_graphicsdrawImage($hGraphicGUI,$inversion,0,0)
[color=#FF0000]$hdc=_winapi_getdc($hGui)[/color]
$hcdc=_winapi_createcompatibledc($hdc)
$hcbmp=_winapi_createcompatiblebitmap($hdc,$largeur,$hauteur)
_winapi_selectobject($hcdc,$hcbmp)
_winapi_bitblt($hcdc,0,0,$largeur,$hauteur,$hdc,0,0,$NOTSRCERASE)
$gc=_gdiplus_graphicscreatefromhdc($hdc)
$bmp=_gdiplus_bitmapcreatefromhbitmap($hcbmp)
_gdiplus_graphicsdrawimage($hGraphic,$bmp,0,0)
_gdiplus_graphicsdispose($gc)
_gdiplus_imagedispose($bmp)
_winapi_deleteobject($hcbmp)
_gdiplus_Graphicsdrawimage($hGraphicGUI,$inversion,0,0)
_gdiplus_bitmapsetresolution($inversion,300,300)
_gdiplus_imagesavetofile($inversion,"test.bmp")
_gdiplus_imagedispose($capture)
_gdiplus_graphicsdispose($hGraphic)
_gdiplus_graphicsdispose($hGraphicGUI)
_winapi_deleteobject($inversion)
_winapi_releasedc(0,$hdc)
_winapi_deletedc($hcdc)
_winapi_redrawwindow(0,0,0,bitor($RDW_INVALIDATE,$RDW_UPDATENOW,$RDW_ALLCHILDREN))
_gdiplus_shutdown()

func _gdiplus_graphicsdrawimagerectrecttrans($graphique,$temporaire,$inversionx,$inversiony,$largeur2="",$hauteur2="",$inversion2x = "",$inversion2y="",$inversion_largeur="",$inversion_hauteur="",$unite=2,$transparance=1)
local $couleur_matrix,$x,$atribution,$largeur=_gdiplus_ImageGetWidth($temporaire),$hauteur=_gdiplus_ImageGetHeight($temporaire)
if $largeur2=0 or $largeur2="" then $largeur2=$largeur
if $hauteur2=0 or $hauteur2="" then $hauteur2=$hauteur
if $inversion2x="" then $inversion2x=$inversionx
if $inversion2y="" then $inversion2y=$inversiony
if $inversion_largeur="" then $inversion_largeur=$largeur2
if $inversion_hauteur="" then $inversion_hauteur=$hauteur2
if $unite="" then $unite=2
$couleur_matrix=dllstructcreate("float[5];float[5];float[5];float[5];float[5]")
$x=dllstructsetdata($couleur_matrix,1,1,1)*dllstructsetdata($couleur_matrix,1,1,2)*dllstructsetdata($couleur_matrix,1,1,3)*dllstructsetdata($couleur_matrix,4,$transparance,4)*dllstructsetdata($couleur_matrix,5,0.1,1)*dllstructsetdata($couleur_matrix,5,0.1,2)*dllstructsetdata($couleur_matrix,5,0.1,3)*dllstructsetdata($couleur_matrix,5,1,5)
$atribution=dllcall($ghGDIPDll,"int","GdipCreateImageAttributes","ptr*",0)
$atribution=$atribution[1]
dllcall($ghGDIPDll,"int","GdipSetImageAttributesColorMatrix","ptr",$atribution,"int",1,"int",1,"ptr",dllstructgetptr($couleur_matrix),"ptr",0,"int",0)
dllcall($ghGDIPDll,"int","GdipDrawImageRectRectI","hwnd",$graphique,"hwnd",$temporaire,"int",$inversion2x,"int",$inversion2y,"int",$inversion_largeur,"int",$inversion_hauteur,"int",$inversionx,"int",$inversiony,"int",$largeur2,"int",$hauteur2,"int",$unite,"ptr",$atribution,"int",0,"int",0)
dllcall($ghGDIPDll,"int","GdipDisposeImageAttributes","ptr",$atribution)
return
endfunc

func _gdiplus_bitmapsetresolution($resolution,$dpix,$dpiy)
local $resultat=dllcall($ghgdipdll,"uint","GdipBitmapSetResolution","hwnd",$resolution,"float",$dpix,"float",$dpiy)
if @error then return seterror(@error,@extended,false)
$resultat2=$resultat[0]
return $resultat[0]=0
endfunc
J’ai essayé pas malle de truc comme remplacer,

Code : Tout sélectionner

[color=#FF0000]$hGraphicGUI=_gdiplus_graphicscreatefromhwnd($hGui)[/color]
par

Code : Tout sélectionner

$hGraphicGUI=_gdiplus_graphicscreatefromhwnd($capture)
ou

Code : Tout sélectionner

$hGraphicGUI=_gdiplus_graphicscreatefromhwnd($image)
ou

Code : Tout sélectionner

$hGraphicGUI=_gdiplus_graphicscreatefromhwnd($handel)
Mais aucunes de ces 3 variable ne compense la gui.

J’ai aussi essayé pas malle d’autre truc qui n’on pas fonctionné.

Lorsque j’enlève cette Gui, j’ai le message d’erreur de Windows qui doit que ce programme vas s’arrêté maintenant avec la question voulez vous envoyer le rapport ou non ?

Comment résoudre ce problème ?
Avatar du membre
bloodwolff
Membre émérite
Membre émérite
Messages : 655
Enregistré le : ven. 18 avr. 2008 22:36
Localisation : Québec
Status : Hors ligne

Re: [..] Inversion de couleur pour une image

#8

Message par bloodwolff »

La Gui est encore présente mais ce n'est pas un petit flash qui peut déranger ...
► Afficher le texte
Compte skype : bloodwolfff
mystere
Niveau 4
Niveau 4
Messages : 62
Enregistré le : ven. 26 nov. 2010 22:37
Status : Hors ligne

Re: [..] Inversion de couleur pour une image

#9

Message par mystere »

Non, mais bon ces pas très pro de laissez comme sa. Mais force d’essai pour enlevé cette gui, quelque chose me reste encore un mystère. Je ne comprend pas trop le rôle de la fonction GUISetState(), si je l’enlève en gardant la gui, l’image ne ce transforme plus. Pourquoi ?
Répondre