[R] Incrementer directement des valeurs dans un buffer

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
Avatar du membre
Sachadee
Niveau 2
Niveau 2
Messages : 23
Enregistré le : dim. 29 sept. 2013 03:50
Status : Hors ligne

[R] Incrementer directement des valeurs dans un buffer

#1

Message 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
Modifié en dernier par Sachadee le sam. 09 nov. 2013 00:07, modifié 1 fois.
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2284
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

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

#2

Message 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"))
 
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
Avatar du membre
Sachadee
Niveau 2
Niveau 2
Messages : 23
Enregistré le : dim. 29 sept. 2013 03:50
Status : Hors ligne

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

#3

Message 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+
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2284
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

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

#4

Message 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
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
Avatar du membre
Sachadee
Niveau 2
Niveau 2
Messages : 23
Enregistré le : dim. 29 sept. 2013 03:50
Status : Hors ligne

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

#5

Message 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+
Répondre