Page 1 sur 1

[R] Incrementer directement des valeurs dans un buffer

Posté : ven. 08 nov. 2013 00:33
par Sachadee
Bonjour à tous,

Voici ma question, j'ai fait un code qui me reconstruit une image à partir de valeurs
hexadécimal qui se trouve dans un fichier texte. Sur chaque ligne se trouve la valeur Hexadécimal de 1 pixel.

Je définie donc un buffer pour la reconstruction de mon image après avoir créer le container vide de l'image à recréer :

Code : Tout sélectionner

$v_BufferA = DllStructCreate("byte[" & $height * $width * 4 & "]",$scan0)
Donc pour la reconstruction je récupère chaque valeurs de mon fichier texte et j'incrémente une variable ($aVar)

Code : Tout sélectionner

While 1
    $line = FileReadLine($file)
    If @error = -1 Then ExitLoop
    If $count >= 1 Then
            $aVar = $aVar & $Line
            EndIf
    $count = ($count + 1)
WEnd
lorsque je sort de ma boucle je definie le contenue du buffer avec ma liste pleine

Code : Tout sélectionner

DllStructSetData($v_BufferA, 1, "0x" & $aVar)
et en final je sauve mon image recréé.

Cela fonctionne parfaitement, seulement si l'image est grande l'incrémentation de la liste $aVar prend beaucoup de temps.
En fait plus la liste grossie et plus ça ralentit (assez logiquement).

J'aimerais savoir si quelqu'un aurait une idée pour mettre les valeurs une par une directement dans le buffer sans incrèmenter une liste, ce qui serait vraiment beaucoup plus rapide. Ça fait 1 semaines que je me creuse la tête avec ce "DllStructSetData" sans voir la solution.

D'avance merci

Re: [..] Incrementer directement des valeurs dans un buffer

Posté : ven. 08 nov. 2013 09:12
par jchd
Si je comprends bien ton problème est d'éliminer les sauts de ligne dans le flux de ton fichier d'entrée texte hexa et de transformer le résultat en binaire. En fait le véritable problème est l'emploi d'un format aussi incroyablement inadapté...

Enfin si c'est bien ça, tu devrais pouvoir t'en sortir avec un truc du genre :

Code : Tout sélectionner

Local $InpTxt = FileRead("mon fichier image au format.alakon")
Local $InpBin = Binary("0x" & StringRegExpReplace($InpTxt, "(?s)(.{8})\R", "\1"))
 

Re: [..] Incrementer directement des valeurs dans un buffer

Posté : ven. 08 nov. 2013 13:05
par Sachadee
Salut Jchd,

merci pour ton humour, et ton excellente solution qui est effectivement très rapide et résoud mon problème

Génial !!!

Il est clair que du point de vu Autoit le format utilisé est "Alakon" :lol:
Mais dans mon cas je n'ai pas d'autre solution vu que j'ai une limitation sur la taille de mes ligne (Bat), c'est pour cela que je n'ai pas eu d'autres choix que d'utiliser ce format.

Encore un grand merci !

Je ne met pas encore le Post en résolu parce que la question initiale subsiste (Incrementer directement des valeurs dans un buffer), bien que mon problème de fond ai été résolu.

A+

Re: [..] Incrementer directement des valeurs dans un buffer

Posté : ven. 08 nov. 2013 22:07
par jchd
Pour placer chaque octet dans une structure, tu peux faire ça :

Code : Tout sélectionner

; en supposant que ton fichier soit intégralement au format RrGgBbAaCrLf, soit donc un multiple ($height * $width) de 10 octets
Local $InpTxt = FileRead("mon fichier image au format.alakon")
Local $InpBin = Binary("0x" & StringRegExpReplace($InpTxt, "(?s)(.{8})\R", "\1"))

; transfert des octets un par un dans une structure. Prévoir un délai !
Local $v_BufferA = DllStructCreate("byte[" & $height * $width * 4 & "]")
Local $nPixels = StringLen($v_BufferA) / 10
For $i = 0 To $nPixels - 1
    Local $j = $i * 4 + 1
    DllStructSetData($v_BufferA, 1, BinaryMid($InpBin, $j    , 1), $j    )
    DllStructSetData($v_BufferA, 1, BinaryMid($InpBin, $j + 1, 1), $j + 1)
    DllStructSetData($v_BufferA, 1, BinaryMid($InpBin, $j + 2, 1), $j + 2)
    DllStructSetData($v_BufferA, 1, BinaryMid($InpBin, $j + 3, 1), $j + 3)
Next

Re: [..] Incrementer directement des valeurs dans un buffer

Posté : sam. 09 nov. 2013 00:06
par Sachadee
Un grand merci à toi Jchd,

C'est ce que je voulais savoir à la base. même si je vais utiliser ta première solution.

Cette fois je mets en résolu.

A+