[..] Récuperer une image en String

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Avatar du membre
Iste
Niveau 11
Niveau 11
Messages : 1870
Enregistré le : jeu. 04 déc. 2008 14:21
Localisation : 76
Status : Hors ligne

[..] Récuperer une image en String

#1

Message par Iste »

Salutations,

Encore dans le cadre de génération de page web, j'aimerai récupérer en tant que String le contenu d'un fichier image.
Quand je fais :

Code : Tout sélectionner

$file = FileOpen("img.bmp",16)
$bin = FileRead($file)

ClipPut($bin)

FileWrite("img2.bmp",BinaryToString($bin))
L'image est bien copier en tant qu'img2.bmp, et le presse papier contient bien expression binaire voulue. Étrangement, si je ne met pas le BinaryToString(), ca marche quand même, on va dire que la fonction est intelligente.
Bref, par contre, si je tente de ClipPut(BinaryToString($bin)), je n'ai plus que les deux 1er lignes du fichier dans le presse papier :s

Ce que j'aimerai faire au final c'est récupérer le contenu du fichier pour l'écrire en dur et générer l'image. Je pense que si j'arrive a l'afficher dans une msgbox(), ca sera bon !

Merci d'avance
Signez ici
Avatar du membre
matwachich
Membre émérite
Membre émérite
Messages : 986
Enregistré le : lun. 19 oct. 2009 04:04
Localisation : Algérie
Status : Hors ligne

Re: [..] Récuperer une image en String

#2

Message par matwachich »

Cherche sur ce forum un UDF de Tlem: FileToBinaryString, c'est exactement ce que tu cherche
Sortons VW du coté obscure! - La curiosité est un vilain défaut! Cliquez ici
Avatar du membre
Iste
Niveau 11
Niveau 11
Messages : 1870
Enregistré le : jeu. 04 déc. 2008 14:21
Localisation : 76
Status : Hors ligne

Re: [..] Récuperer une image en String

#3

Message par Iste »

béh non, le problème est exactement le meme, c'est déja ce que je faisait dans mon exemple
Si tu rajoute un petit MsgBox('','',BinaryToString($FileBin)) tu véras qu'on récup que les deux premières ligne, hors j'aimerai avoir tout le fichier, comme l'ont pourrait le lire dans scite

Merci quand meme pour ta réponse, je continu de faire des testes de mon coté
Signez ici
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11824
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Récuperer une image en String

#4

Message par Tlem »

matwachich t'a pourtant bien aiguillé !!! :roll:
Certes, il parle de FileToBinaryString au lieu de _FileToBinaryFunction.au3, mais l'idée était là.

http://www.autoitscript.fr/forum/viewto ... 8443#p8443
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
Iste
Niveau 11
Niveau 11
Messages : 1870
Enregistré le : jeu. 04 déc. 2008 14:21
Localisation : 76
Status : Hors ligne

Re: [..] Récuperer une image en String

#5

Message par Iste »

C'est bien le topic que j'ai été voir, et je confirme, le problème reste le meme
Signez ici
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11824
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Récuperer une image en String

#6

Message par Tlem »

Je ne comprend pas du tout pourquoi tu re-convertit ta chaine binaire en chaine de caractère !
Si tu fait ça, il y aura sans doute des caractères spéciaux et cela provoquera l'affichage ou le traitement que d'une partie de la chaine ...
Comme ce que tu as. :roll:
Garde l'affichage en hexadécimal. 8)

Code : Tout sélectionner

$file = FileOpenDialog("Fichier à convertir", @DesktopDir, "All Files (*.*)")
If @error Then Exit

$f = FileOpen($file, 16)
$t = FileRead($f)
FileClose($f)

MsgBox(0, 'Mon fichier en hexa', $t)
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
Iste
Niveau 11
Niveau 11
Messages : 1870
Enregistré le : jeu. 04 déc. 2008 14:21
Localisation : 76
Status : Hors ligne

Re: [..] Récuperer une image en String

#7

Message par Iste »

Tlem a écrit :Je ne comprend pas du tout pourquoi tu re-convertit ta chaine binaire en chaine de caractère !
Bah car je dois l'envoyer pour retrouver l'image !
Si je l'envoi en hexa, ca fonction plutot bien, mais le code n'est plus celui que je veux.
J'ai simplement besoin de faire un ConsoleWrite() du contenu d'un fichier, sans altération
Signez ici
Avatar du membre
timmalos
Niveau 11
Niveau 11
Messages : 1970
Enregistré le : dim. 18 mai 2008 15:16
Status : Hors ligne

Re: [..] Récuperer une image en String

#8

Message par timmalos »

Bah je pense que c'est impossible a cause des caractères peciaux, avec les caracteres hexa tu peux par exemple avoir 0003 qui correspond à EndOfFile si tu le remet normal, donc il n'ira pas plus loin, mais tu peux egalement avoir pleins d'autres, cf Table ASCII que MsgBox est incapable d'afficher. http://www.asciitable.com/

Essaye avec une autre image, peut etre ca marchera ou affichera plpus ou moins de ligne, etc...
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11824
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Récuperer une image en String

#9

Message par Tlem »

Pour reconstruire l'image, il faudra obligatoirement passer par la reconstitution de fichier image sur le disque ou en mémoire.
Et cela (quel que soit le cas) ne pourra passer par la conversion de la chaine binaire en string !!!
Sinon, l'autre solution consiste à inclure l'image dans les ressources et d'utiliser Ressource.au3.
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
ani
Niveau 11
Niveau 11
Messages : 1826
Enregistré le : lun. 23 juil. 2007 12:31
Localisation : Bureau
Status : Hors ligne

Re: [..] Récuperer une image en String

#10

Message par ani »

Bonjour,
j'ai pas trop siuvit, :(

dans le code à quoi te sert le cliput ?

Pour faire une copie de l'image, tout simple.

Ouverture du fichier en mode binaire (16) , lecture et pour finir fermeture du fichier. c'est tout :o

Code : Tout sélectionner

$Open = fileopen("img.bmp",16)
$Read = fileread($Open)
fileclose($Open)

filewriteline("img1.bmp",$Read)
ps: si j'ai pas suivit, hm ... ;)
Avatar du membre
Iste
Niveau 11
Niveau 11
Messages : 1870
Enregistré le : jeu. 04 déc. 2008 14:21
Localisation : 76
Status : Hors ligne

Re: [..] Récuperer une image en String

#11

Message par Iste »

timmalos a écrit :Bah je pense que c'est impossible a cause des caractères peciaux
C'est ce que j'ai pensé en 1er, seulement je ne voie vraiment pas de cratères spéciaux qui justifieraient ca. Après, c'est fort possible que cela vexe quand même la msgbox(),comme la String semble bien formé dans le script (bonne longueurs avec un Stringlen(), réécriture possible)
Mais je sais que sais que la console de Windows peut l'accepter, pas de raison donc qu'autoit ne l'envoi pas.
Tlem a écrit :Pour reconstruire l'image, il faudra obligatoirement passer par la reconstitution de fichier image sur le disque ou en mémoire.
Mon image est déja construite, j'ai déja tout les octé dans ma variable ! j'veux juste les taper dans mon STDOUT moi :(
Tlem a écrit :Sinon, l'autre solution consiste à inclure l'image dans les ressources et d'utiliser Ressource.au3.
C'est peut etre une solution, mais comme j'aimerai récup les données dynamiquement, c'est pas vraiment envisageable.
ani a écrit :dans le code à quoi te sert le cliput ?
Juste a montrer que la chaine n'est pas complete.

En fait, j'ai un programme qui lance mon script et qui attend une page web en retour. Pour cela, il lit la sortie standard de mon script. J'arrive bien a envoyer du text, mais étrangement, pas le code d'une image. Cela coupe juste apres la 2em ligne, et le phénomène se retrouve avec les fonction ClipPut() et MsgBox().
Le seul moyen que j'ai pour envoyer tout le contenu du fichier, c'est en binaire, mais là, ma page web n'est plus bien formé ^^'
timmalos a écrit :Essaye avec une autre image, peut etre ca marchera ou affichera plpus ou moins de ligne, etc...
J'ai essayé plusieurs images dans plusieurs format, le problème reste le même :s Du moins en apparence, je me pencherais plus sur la question et essayerai de trouver la raison de la coupure.

Merci d'essayer de m'aider !
Signez ici
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écuperer une image en String

#12

Message par TommyDDR »

Désolé mais tu ne pourras pas afficher ta chaine de caractère car dans ton image se trouvent des caractères NULL (0x00) qui signifie "Fin de chaine de caractère" c'est pour cela que tu n'a que le début de ta chaîne. Tu sera obliger de passer en binaire pour arriver à quelque chose avec ton image.
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679
Avatar du membre
Iste
Niveau 11
Niveau 11
Messages : 1870
Enregistré le : jeu. 04 déc. 2008 14:21
Localisation : 76
Status : Hors ligne

Re: [..] Récuperer une image en String

#13

Message par Iste »

En effet, apres avoir regardé j'en avais déduit la meme conclusion pour la msgbox()
Mais cela n'explique pas pourquoi autoit ne veux pas renvoyer cette chaine dans presse papier ou la sorti standard.
(encore une foi, si j'ouvre le fichier avec un editeur de text, je peux tres bien tout copier, et d'autre logiciel se servent de la sorti standard pour afficher des images)

merci
Signez ici
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écuperer une image en String

#14

Message par TommyDDR »

Peut-tu fournir ton code qui ne veut pas afficher dans la sortie STD ?
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679
Avatar du membre
Iste
Niveau 11
Niveau 11
Messages : 1870
Enregistré le : jeu. 04 déc. 2008 14:21
Localisation : 76
Status : Hors ligne

Re: [..] Récuperer une image en String

#15

Message par Iste »

un simple

Code : Tout sélectionner

$file = FileOpen("cmd.png")
$source = FileRead($file)

ConsoleWrite($source)

Sleep(5000)
Ne pas oublier d'activer la console lors de la compilation

Resultat : une console avec marqué dedan "IHDR4" au lieux de tout un tas de machins. D'ailleur, le 4 ne devrait pas s'afficher
Signez ici
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11824
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Récuperer une image en String

#16

Message par Tlem »

Après avoir relut le sujet depuis le début, voici ma réflexion :
Tu veut envoyer la représentation d'une image en convertissant les données binaire en chaine puis afficher le résultat dans la console ou dans une MsgBox ...
Mais cela n'est pas possible à cause des caractères spéciaux comme cela à été dit plusieurs fois.
Prend une image et édite là avec un éditeur hexadécimal, tu constatera que dans le fichier tu trouve des valeurs inférieures à 0x10 et qui pour certaines pose problème lors de leur l'affichage.
Notepad ne te pose pas ce problème, car il interprète ces caractères spéciaux, mais la console, le presse papier ou la boite de message, vont interprété le caractère ASCII tel qu'il se présente.
Iste a écrit :j'veux juste les taper dans mon STDOUT
Cela est possible, mais sous forme hexadécimal et non ASCII.
Ou alors, peut être faut-il changer pour de l'UTF.
Iste a écrit :En fait, j'ai un programme qui lance mon script et qui attend une page web en retour.
Je suppose que tu parle d'une page HTML. :roll:
Iste a écrit :J'arrive bien a envoyer du text, mais étrangement, pas le code d'une image.
Comment fait-tu pour fabriquer une page HTML, avec à l'intérieur, le code d'une image ?
Iste a écrit :d'autre logiciel se servent de la sorti standard pour afficher des images
Lesquels par exemple ?
Sous quel format sont les images ?
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
arrkhan
Niveau 8
Niveau 8
Messages : 528
Enregistré le : sam. 17 nov. 2007 03:30
Status : Hors ligne

Re: [..] Récuperer une image en String

#17

Message par arrkhan »

Comment fait-tu pour fabriquer une page HTML, avec à l'intérieur, le code d'une image ?
les images ne serait elles pas en base64 ?, me rappelle avoir pondu un script dans le genre, j'essaie de remettre la main dessus.

Edit : j'ai retrouvé, mais je n'utilisait pas un convertisseur 100% AutoIt, tout les fichier sont dans le zip joint.
Bon si je suis à coté de la plaque, ben je dirais, comme d'hab quoi ...

Edit2 : Bon finalement, je l'ai fait en tout AutoIt :P
► Afficher le texte
testé avec succès sur des images en .gif, .jpg et .png
En même temps je crois que ça répond pas vraiment à ton problème ...
Avatar du membre
Iste
Niveau 11
Niveau 11
Messages : 1870
Enregistré le : jeu. 04 déc. 2008 14:21
Localisation : 76
Status : Hors ligne

Re: [..] Récuperer une image en String

#18

Message par Iste »

Tlem a écrit :Après avoir relut le sujet depuis le début, voici ma réflexion :
Tu veut envoyer la représentation d'une image en convertissant les données binaire en chaine puis afficher le résultat dans la console ou dans une MsgBox ...
Mais cela n'est pas possible à cause des caractères spéciaux comme cela à été dit plusieurs fois.
Et comme je l'ai déja dis plusieurs fois aussi cela est tout a fait possible je n'ai aucun mal a le faire en ne passant pas par autoit. Si j'ouvre le fichier avec scite, je peux copier dans mon presse papier tout le code. Un autre programme peut tout me renvoyer dans la console.
Tlem a écrit :Prend une image et édite là avec un éditeur hexadécimal, tu constatera que dans le fichier tu trouve des valeurs inférieures à 0x10 et qui pour certaines pose problème lors de leur l'affichage.
Oui ca je le sais bien, je l'ai remarqué dès le début, quand j'ai ouvert mes images avec scite.
Tlem a écrit :Notepad ne te pose pas ce problème, car il interprète ces caractères spéciaux, mais la console, le presse papier ou la boite de message, vont interprété le caractère ASCII tel qu'il se présente.
Encore une foi non, le presse papier et la console du moins (j'ai aucun test positif pour la msgbox) sont parfaitement capable d'interpréter ces données.
Tlem a écrit :
Iste a écrit :j'veux juste les taper dans mon STDOUT
Cela est possible, mais sous forme hexadécimal et non ASCII.
Ou alors, peut être faut-il changer pour de l'UTF.
Gné ? je ne veux pas toucher a l'encodage, je veux juste renvoyer ma fichu chaine de caractère sans la modifier en quoi que ce soit
Tlem a écrit :
Iste a écrit :En fait, j'ai un programme qui lance mon script et qui attend une page web en retour.
Je suppose que tu parle d'une page HTML. :roll:
Non, une page web, il n'y a pas une seule goute de HTML dedans... C'est juste une fichu image avec en plus en haut les header http qui vont bien.
Tlem a écrit :
Iste a écrit :J'arrive bien a envoyer du text, mais étrangement, pas le code d'une image.
Comment fait-tu pour fabriquer une page HTML, avec à l'intérieur, le code d'une image ?
Bah comme dit il ne s'agit pas d'une page HTML
Tlem a écrit :
Iste a écrit :d'autre logiciel se servent de la sorti standard pour afficher des images
Lesquels par exemple ?
Sous quel format sont les images ?
PHP, avec tout type d'image. C'est d'ailleurs une "imitation" de PHP en autoit que je cherche a reproduire.

Et comme le petit jeu du "c'est pas possible - si ca l'est" commence a prendre plus d'ampleur que le sujet lui meme, voici une petite image du rendu par PHP dans la console.Image
et de ce que me renvoi autoit
Image

Donc voila, la console peut prendre ces caractères et c'est tout ce que je lui demande.
Si je modifie le code de l'image elle sera corrompue et ne pourra pas être affichée par un navigateur. Pas question donc de passer en binaire ou autre encodage.

@arrkhan : je n'ai pas pu tester ton code qui n'arrive pas au bout chez moi (plantage net), mon architecture est en 64bit, peut etre le problème vient de la ?


Bref je vous remercie tous d'essayer de m'aider, mais si je vous dis que c'est possible c'est que j'ai mes raisons ! J'pas toujours envie de tout étaler simplement par manque de temps déja, puis aussi car j'veux pas forcément embrouiller tout le monde avec des info inutiles. Mais merci de ne plus me dire que c'est impossible ! Encore une foi, PHP est tout a fait capable de renvoyer le contenu de n importe quel fichier dans la console. Donc autoit doit surement savoir en faire autant !
Signez ici
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écuperer une image en String

#19

Message par TommyDDR »

J'ai une "Demi-Solution"

J'ai réussi à afficher tous les caractères sauf le 0x00

Code : Tout sélectionner

Local $File = FileOpen("test.jpg", 0)
Local $Contenu = FileRead($File)
FileClose($File)

For $i = 1 To StringLen($Contenu)
    ConsoleWrite(StringMid($Contenu, $i, 1))
Next
 
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679
Avatar du membre
timmalos
Niveau 11
Niveau 11
Messages : 1970
Enregistré le : dim. 18 mai 2008 15:16
Status : Hors ligne

Re: [..] Récuperer une image en String

#20

Message par timmalos »

Hors sujet, mais pour info j'ai une autre foncion base64 :

Code : Tout sélectionner

; ===================================================================
; _Base64Encode($string)
;
; Encodes a string in Base64 using lowlevel dll
; Parameters:
;    $string - IN - The string to encode
; Returns:
;    A valid encoded string that can be used as GET or POST variables.
; ===================================================================
Func _Base64Encode($input)
 
    $input = Binary($input)
 
    Local $struct = DllStructCreate("byte[" & BinaryLen($input) & "]")
 
    DllStructSetData($struct, 1, $input)
 
    Local $strc = DllStructCreate("int")
 
    Local $a_Call = DllCall("Crypt32.dll", "int", "CryptBinaryToString", _
            "ptr", DllStructGetPtr($struct), _
            "int", DllStructGetSize($struct), _
            "int", 1, _
            "ptr", 0, _
            "ptr", DllStructGetPtr($strc))
 
    If @error Or Not $a_Call[0] Then
        Return SetError(1, 0, "") ; error calculating the length of the buffer needed
    EndIf
 
    Local $a = DllStructCreate("char[" & DllStructGetData($strc, 1) & "]")
 
    $a_Call = DllCall("Crypt32.dll", "int", "CryptBinaryToString", _
            "ptr", DllStructGetPtr($struct), _
            "int", DllStructGetSize($struct), _
            "int", 1, _
            "ptr", DllStructGetPtr($a), _
            "ptr", DllStructGetPtr($strc))
 
    If @error Or Not $a_Call[0] Then
        Return SetError(2, 0, ""); error encoding
    EndIf
 
    Return DllStructGetData($a, 1)
 
EndFunc   ;==>_Base64Encode
 
 
; ===================================================================
; _Base64Decode($string)
;
; Decodes a string in Base64 using lowlevel dll
; Parameters:
;    $string - IN - The string to decode
; Returns:
;    A string decrypted.
; ===================================================================
Func _Base64Decode($input_string)
 
    Local $struct = DllStructCreate("int")
 
    $a_Call = DllCall("Crypt32.dll", "int", "CryptStringToBinary", _
            "str", $input_string, _
            "int", 0, _
            "int", 1, _
            "ptr", 0, _
            "ptr", DllStructGetPtr($struct, 1), _
            "ptr", 0, _
            "ptr", 0)
 
    If @error Or Not $a_Call[0] Then
        Return SetError(1, 0, "") ; error calculating the length of the buffer needed
    EndIf
 
    Local $a = DllStructCreate("byte[" & DllStructGetData($struct, 1) & "]")
 
    $a_Call = DllCall("Crypt32.dll", "int", "CryptStringToBinary", _
            "str", $input_string, _
            "int", 0, _
            "int", 1, _
            "ptr", DllStructGetPtr($a), _
            "ptr", DllStructGetPtr($struct, 1), _
            "ptr", 0, _
            "ptr", 0)
 
    If @error Or Not $a_Call[0] Then
        Return SetError(2, 0, ""); error decoding
    EndIf
 
    Return DllStructGetData($a, 1)
 
EndFunc   ;==>_Base64Decode
 
Répondre