Page 1 sur 1

[R] Récupèrer la valeur RGB de chaque pixel d'une image GIF

Posté : mar. 15 oct. 2013 17:47
par Sachadee
Bonjour à tous,

Y a t'il un moyen de récuperer la valeur RGB (0-255) de chaque pixel d'un fichier GIF ou TIF (8bits)
et d'écrire ces valeurs dans un fichier texte.

Pour l'instant je le fais en Python, mais ça m'arrangerait de le faire en Autoit, pour ne pas faire d'appel externe.

Je précise que le fichier gif est petit (87x24)

D'avance merci pour votre aide

Re: [..] Récupèrer la valeur RGB de chaque pixel d'une image

Posté : mar. 15 oct. 2013 18:17
par alabases
Il faudrait peut etre voir du coté de l'UDF ImageSearch pour connaitre les classes et les methodes

Sinon:
Recuperer la taille de l'image (w-h)
Prévoir un tableau pour recueillir chaque valeur (au moins identique a la résolution 87+1x24+1)
Faire une boucle i pour la largeur et une sous boucle j pour la hauteur
Pour la formule je pense à $couleur[j] = PixelGetColor(i,j)
Par contre la valeur retourné est en Hexa donc prévoir une méthode pour la conversion RGB

Re: [..] Récupèrer la valeur RGB de chaque pixel d'une image

Posté : mar. 15 oct. 2013 18:18
par Tlem
Sinon, ce sujet devrait correspondre exactement à ce que vous cherchez :
http://www.autoitscript.com/forum/topic ... -an-image/

Re: [..] Récupèrer la valeur RGB de chaque pixel d'une image

Posté : mer. 16 oct. 2013 03:55
par Sachadee
Merci pour vos réponses,

Après quelques recherche j'ai trouver un code intèressant de "Prodigy" sur :

http://www.autoitscript.com/forum/topic ... -from-bmp/

que j'ai modifié de cette manière pour lire tous les pixels d'une image sans l'afficher et sauver la valeurs des pixels dans un fichier texte :

Code : Tout sélectionner

#include <GDIPlus.au3>
#include <GDIPlusConstants.au3>


_GetPixelFromBMP("Captcha1.gif")

Func _GetPixelFromBMP($sImage);git die farbe an $x,$y einer 24bpp-bitmap aus
    Local $pbitmap, $Bmp
    Local $tBD, $iWidth, $iHeight, $iStride
    Local $pData, $color

    _GDIPlus_Startup()
    $pbitmap = _GDIPlus_ImageLoadFromFile($sImage)       ;bild laden
    If @error Then Return SetError(1, 2, 0)
    $tBD = _GDIPlus_BitmapLockBits($pbitmap, 0, 0, _GDIPlus_ImageGetWidth($pBitmap), _GDIPlus_ImageGetHeight($pBitmap), $GDIP_ILMREAD, $GDIP_PXF24RGB)
    If @error Then MsgBox(0, "", "Error locking region " & @error)
    $iWidth = DllStructGetData($tBD, 1)      ;breite der bitmap
    $iHeight = DllStructGetData($tBD, 2)    ;hoehe der bitmap
    $iStride = DllStructGetData($tBD, 3)    ;Erklärung : <a href='http://www.autoitscript.com/forum/index.php?showtopic=106673&view=findpost&p=753169' class='bbc_url' title=''>http://www.autoitscript.com/forum/index.php?showtopic=106673&view=findpost&p=753169</a>
    $pData = DllStructGetData($tBD, 5)      ;pointer auf die bitmapdaten
    $Bmp = DllStructCreate("byte[" & $iStride * $iHeight & "]", $pData)  ;struct gefüllt mit den Daten der Bitmap

    For $y = 0 to $iHeight Step 1 ;ON BOUCLE SUR LA HAUTEUR
       For $x = 0 To $iwidth Step 1 ;ON BOUCLE SUR LA LARGEUR

    $position    = $istride * ($y - 1) + 3 * ($x-1)      ;Umrechnung der Position von x- und y- Koordinaten
    $substruct     = DllStructCreate("ubyte[3]", DllStructGetPtr($Bmp) + $position)  ;eine 3-byte struct an die position vom pixel schreiben
    $Color        = DllStructgetData($substruct, 1)  ;Daten aus der struct lesen
    ;FileWrite("testpixel.txt", $color & @CRLF) ;ON ECRIT LA VALEUR DU PIXEL DANS UN TXT
    FileWrite("testpixel.txt", "Col : " & $x & " Ligne : " & $y & " " & $color & @CRLF & " ")
       Next
    Next
 
    _GDIPlus_BitmapUnlockBits($pbitmap, $tBD)
    ;_WinAPI_DeleteObject($hBmp)
    _GDIPlus_ImageDispose($pbitmap)
    _GDIPlus_Shutdown()
    return $color
EndFunc   ;==>_GetImagePixels
 
Autre lien intèressant qui traite du sujet (à part celui donné par Tlem :D ) :

l'excellent GDIP.au3 - http://www.autoitscript.com/forum/topic/106021-gdipau3/
et sur ce forum également un topic sur le sujet - http://www.autoitscript.fr/forum/viewto ... 93&start=0

Voilà je mets le sujet comme clos, mais si quelqu'un à une idée pour améliorer le temps d'éxecution ou une autre méthode plus performante
qu'il n´hesite pas à poster.

Encore merci et à +