[R] Changer de couleur un certain pixel par un autre pixel

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

[R] Changer de couleur un certain pixel par un autre pixel

#1

Message par mystere »

Bonjour, voilà mon problème j’aimerai remplacer dans une image bmp, uniquement les pixels de couleur 0xe5e5e5 par la couleur 0xffffff. Mais le souci ces que âpres mainte recherche et test je n’arrive pas a faire ceci. J’ai trouvé un exemple de code sur ce lien.

http://www.autoitscript.fr/forum/viewto ... ?f=3&t=921

Le forum anglais en parle aussi.

http://www.autoitscript.com/forum/topic ... __lockbits

Voici le code qui permettrai de réalisé ceci.

Code : Tout sélectionner

#include<GDIPlus.au3>
#include<GUIConstantsEx.au3>
global const $largeur_gui=119
global const $hauteur_gui=39
$gui=guicreate("",$largeur_gui,$hauteur_gui)
guisetstate()
_gdiplus_startup()
$image=_gdiplus_imageloadfromfile("test.bmp")
;Get handle to a Graphics object
$graphique=_gdiplus_graphicscreatefromhwnd($gui)
;Draw the picture into the GUI - it will stretch to fit the GUI
_gdiplus_graphicsdrawimageRect($graphique,$image,0,0,100,$hauteur_gui)
;Get $tagGDIPBITMAPDATA structure
$bmp=_gdiplus_bitmapLockbits($image,20,20,60,60,$GDIP_ILMWRITE,$GDIP_PXF32RGB)
if @ERROR then msgbox(0,"","Error locking region for writing")
;Stride - Offset, in bytes, between consecutive scan lines of the bitmap. If the stride is positive, the bitmap is top-down. If the stride is negative, the bitmap is bottom-up.
$dll=dllstructgetdata($bmp,"Stride")
consolewrite("Bitmap Stride: " & $dll & @CRLF)
;Image width - Number of pixels in one scan line of the bitmap.
$largeur = dllstructgetdata($bmp,"largeur")
consolewrite("Bitmap Width: " & $largeur & @CRLF)
;Image height - Number of scan lines in the bitmap.
$hauteurt=dllstructgetdata($bmp,"hauteur")
consolewrite("Bitmap Height: " & $hauteurt & @CRLF)
;Pixel format - Integer that specifies the pixel format of the bitmap
$pixel=dllstructgetdata($bmp, "pixel")
consolewrite("Bitmap PixelFormat: " & $pixel & @CRLF)
;Scan0 - Pointer to the first (index 0) scan line of the bitmap.
$scan=dllstructgetdata($bmp,"scan")
consolewrite("Bitmap Scan0: " & $scan & @CRLF)
for $for=0 to $hauteurt -1
for $for2=0 to $largeur -1
$pixel=dllstructcreate("dword", $scan+$for*$dll+$for2*4)
dllstructsetdata($pixel,1,0x0000FF00)
;consolewrite(Hex(dllstructgetdata($pixel, 1)) & @CRLF)
next
;consolewrite("-------" & @CRLF)
next
;Unlock region previously locked for writing
_gdiplus_bitmapunlockbits($image,$bmp)
_gdiplus_graphicsdrawimagerect($graphique,$image,100,0,100,100)
while 1
$message=guigetmsg()
if $message=$GUI_EVENT_CLOSE then exitloop
wend
func OnAutoItExit()
if $image  then _gdiplus_imagedispose($image)
_gdiplus_shutdown()
endfunc
Dans ce code je n’arrive pas à comprendre ou le pixel d’entré est pris.

Code : Tout sélectionner

dllstructsetdata($pixel,1,0x0000FF00)
Sur cette ligne qui je pense est le pixel de sortie, je ne comprends pas pourquoi le code de couleur est sur 8 caractères ? :shock:

Si je laisse comme ceci, j’ai une trainé noir incompressible en bas à droite de l’image.

Si j’enlève 2 zéro dans le code de couleur de 8 caractères pour qu’il n’en fasse que 6 alors mon image est toute noir (pixel 0x000000).

Dans mon image il n’y a que 2 pixel différant. Le pixel e5e5e5 et le pixel 0x000000.

Comment résoudre le problème ?
Modifié en dernier par mystere le mar. 14 déc. 2010 18:51, modifié 1 fois.
Avatar du membre
legend
Niveau 7
Niveau 7
Messages : 472
Enregistré le : dim. 26 sept. 2010 12:55
Status : Hors ligne

Re: [..] Changer de couleur un certain pixel par un autre pixel

#2

Message par legend »

Sa fait presque un mois que je vois ce sujet mais j'ai pas voulu intervenir parce qu'ils y aurais des centaines de commentaires sur mes réponses débiles mais simples.
Pourquoi compliquer?
Fait des PixelGetcolor sur chaque pixel de l'écran. (bon il y aurais trop d'array mais sa vas)

Code : Tout sélectionner

global $var = 0
dim $1[10000]

while 1
sleep (5)
$var += 1
$1[$var] = pixelgetcolor ($x, $y)
$x += 1
if $x = @DesktopWidth then
$x = 0
$y += 1
endif
if $y = @DesktopHeight thenexitloop
wend
for $i = 1 to $var
stringreplace ($1[$i], "code couleur initial", "code couleur a sortir")
 
J'espére que cette réponse n'est pas trop nulle.
Bonne journée
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: [..] Changer de couleur un certain pixel par un autre pixel

#3

Message par bloodwolff »

Legend Je pense que tu n'a pas bien compris sa demande ... je te conseil de la relire
Compte skype : bloodwolfff
Avatar du membre
legend
Niveau 7
Niveau 7
Messages : 472
Enregistré le : dim. 26 sept. 2010 12:55
Status : Hors ligne

Re: [..] Changer de couleur un certain pixel par un autre pixel

#4

Message par legend »

Bien, je pense que mon code, sortira des couleurs choisies avec 6chiffres parce que c'est avec un string replace (c'est lui qui choisira le code de couleur de sortie, dependant du code d'entrée.)
Sinon aprés obtenir les cordonnées et les couleurs des pixels je sais pas vraiment comment créer une image a partir de cela.
Pour le code, c'est trés long, sa me donne pas envie de lire :P
Sinon si ma réponse est innutile je suis encore désolé.
Mais bon, sa pouvait servir, donc je l'ai donnée.
Bonne journée.
mystere
Niveau 4
Niveau 4
Messages : 62
Enregistré le : ven. 26 nov. 2010 22:37
Status : Hors ligne

Re: [..] Changer de couleur un certain pixel par un autre pixel

#5

Message par mystere »

Merci de vos réponses, mais comme le dit bloodwolff, ce n’est pas des pixels a l’écran que je recherche mais bien des pixels dans une image et les remplacer.

PS : Pour le sujet datant d’un mois ce n’est pas celui ci.
Avatar du membre
legend
Niveau 7
Niveau 7
Messages : 472
Enregistré le : dim. 26 sept. 2010 12:55
Status : Hors ligne

Re: [..] Changer de couleur un certain pixel par un autre pixel

#6

Message par legend »

Pourquoi ne pas ouvrir l'image et faire le search? :)
Sinon désolé j'ai cru que c'est le même, pske il y a une grande ressemblance.
Avatar du membre
TommyDDR
Modérateur
Modérateur
Messages : 2130
Enregistré le : mar. 22 juil. 2008 21:55
Localisation : Nantes
Status : Hors ligne

Re: [..] Changer de couleur un certain pixel par un autre pixel

#7

Message par TommyDDR »

Programme fonctionnel.

Alors, le programme ouvre ton image en memoire, change tous les pixels demandés et l'enregistre sous un autre nom

S'utilise comme ca : ChangerCouleur(NomDeLImage, NomDeLImageEnSortie, CouleurARemplacer, ParCelleCi)
► Afficher le textecode
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679
mystere
Niveau 4
Niveau 4
Messages : 62
Enregistré le : ven. 26 nov. 2010 22:37
Status : Hors ligne

Re: [..] Changer de couleur un certain pixel par un autre pixel

#8

Message par mystere »

Merci de ta réponse TommyDDR, mais sa ne fonctionne pas, je ne comprends pas pourquoi le code de couleur est sur 8 caractères au lieu de 6. L’image d’entrée est bien pris en charge ainsi que l’image de sortit. Mais les pixels ne ce modifies pas.

Voici la seul ligne de code que j’ai modifié pour l’instant.

Code : Tout sélectionner

ChangerCouleur("test.bmp","test2.bmp","0x0xE5E5E5","0x000000")
Avatar du membre
TommyDDR
Modérateur
Modérateur
Messages : 2130
Enregistré le : mar. 22 juil. 2008 21:55
Localisation : Nantes
Status : Hors ligne

Re: [..] Changer de couleur un certain pixel par un autre pixel

#9

Message par TommyDDR »

Moi ca marche, si tu n'a pas changé mon script, tu as bien un fichier "test.bmp" a coter du script ?

La couleur est sur 8 caractere car les 2 premiers correspondent à la composante alpha FF = Opaque (sur un bmp, laisse a FF sinon tu auras du noir je crois).
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679
mystere
Niveau 4
Niveau 4
Messages : 62
Enregistré le : ven. 26 nov. 2010 22:37
Status : Hors ligne

Re: [..] Changer de couleur un certain pixel par un autre pixel

#10

Message par mystere »

Merci de ta réponse TommyDDR, c'est bon sa fonctionne, sa venais du faite que j'avais fait sans faire exprès 0x0xE5E5E5 au lieu de 0xE5E5E5. Le problème est résolut. :)
Avatar du membre
TommyDDR
Modérateur
Modérateur
Messages : 2130
Enregistré le : mar. 22 juil. 2008 21:55
Localisation : Nantes
Status : Hors ligne

Re: [R] Changer de couleur un certain pixel par un autre pixel

#11

Message par TommyDDR »

Ah oui, je n'avais même pas remarqué ^^.
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679
Répondre