.. la suite !!
Rubrique Moi
Pour celles et ceux qui se sont creusés (cf Margouillat), je vous offre une version toute nouvelle (de ce soir, en fait) de la Routine de Décryptage de l'Image représentant la Police de Caractères ms-dos.
Tout d'abord, récupérez cette image dans l'article précédent, et enregistrez-la sur votre machine, au format BMP monochrome. Le Fichier obtenu doit avoir une Taille de 2750 Octets.
1) Explication de la Structure du Fichier Image Monochrome
Chaque Pixel ne peut avoir que deux valeurs (allumé ou éteint), ce qui se code sur un seul Bit. Un Octet, 8 bits, peut donc représenter 8 Pixels consécutifs. Notre Police se compose de caractères de 8 Pixels de large sur 12 Pixels de haut. Chaque Caractère est donc codé sur 12 Octets, mais pas consécutifs..
Nous avons "zappé" les 32 premiers Caractères de la Police, il en reste donc 224. La Taille Totale représente 224x12=2688 Octets. Les 62 Octets restants sont l'En-Tête du Fichier, dans lequel sont codées des informations comme le format, la largeur et la hauteur de l'image, le nombre de couleurs (ici 2), etc.. Nous ne l'exploiterons pas ici.
Je vous avais dit que le Fichier commence par la Ligne du Bas, par conséquent les premiers Caractères de notre Police sont en Fin de Fichier :-) Une Ligne de notre Police contient 16 Caractères. Le Premier Octet (ligne du haut) du Premier Caractère (l'espace), se trouve donc en position 2750-16+1=2735. L'Octet suivant (2736) correspond à la Ligne du Haut du Second Caractère (le "!"), etc.. La Seconde Ligne du Premier Caractère (l'espace) se situe .. 16 Octets en Amont, soit en 2735-16
=2719ème Position, etc..
Tout le monde suit ? Alors que contient l'Octet n° 63, le premier de l'image juste après l'en-tête (vous avez 30 secondes ;-D)
- Il contient la Ligne du Bas du Caractère en Bas à Gauche de l'image (une barre horizontale) !! Bravo si vous avez trouvé !!
2) Le Code en Cadeau
Le code ci-dessous est écrit pour tourner en VBA6, sous Excel versions 2000 ou plus. Si vous n'avez pas Excel, vous pouvez l'utiliser sous Word, ou même Powerpoint, etc.. moyennant de changer les deux lignes de récupération du répertoire..
Mode d'emploi: Lancer Excel, avec un Classeur Vide. Appeler l'Editeur VBA (menu Outils->Macros->Editeur VBA, ou Alt-F11 au clavier)
Copier le code ci-dessous, et le coller dans l'éditeur VBA. Enregistrer le classeur dans le même répertoire que l'image.
' ----------------------------
' TabConv (P)2006-2008 MyLzz59
' ( code vba6 - excel 2000&+ )
' ----------------------------
Sub TabConv()
' Chemin et Nom de l'Image
Fic$ = ThisWorkbook.Path
If Right$(Fic$, 1) <> "\" Then Fic$ = Fic$ + "\"
Fic$ = Fic$ + "FIC.BMP" ' Mettre le Nom du Fichier ici..
' Vérifications Sommaires (l'Image Monochrome comporte 2750 Octets)
If Dir$(Fic$) = "" Then MsgBox "BMP Pas Trouvé", vbCritical: Exit Sub
If FileLen(Fic$) <> 2750 Then MsgBox "BMP non conforme", vbCritical: Exit Sub
' Ouverture Image
Open Fic$ For Random As #1 Len = 1
Dim Buf As String * 1
' Ouverture Fichier de Sortie
Open Fic$ + ".Log" For Output As #2
Print #2, "(P)2006-2008 MyLzz59"
For Caractere = 32 To 255' Cf mon Explication ;-)
' (X,Y) Matrice Image
PosY = Caractere \ 16: PosX = Caractere Mod 16
' Position dans le Fichier
PosF = 2735 - 16 * 12 * (PosY - 2) + PosX
' Ecriture En-Tête du Caractère
Print #2, "Caractère n°" + Str(Caractere) + " :"
' Initialisation Compteur
NbPixels = 0
' Lecture
For DeltaY = 0 To 11 ' 12 Pixels de Haut
Get #1, PosF - 16 * DeltaY, Buf: Octet = Asc(Buf)
Chaine$ = " "
' Transformation et Comptage
For DeltaX = 0 To 7 ' 8 Pixels de Large
EtatPixel = (Octet And (2 ^ (7 - DeltaX))) <> 0
Chaine$ = Chaine$ + IIf(EtatPixel, "#", ".")
NbPixels = NbPixels - EtatPixel
Next DeltaX
' Ecriture Image ligne
Print #2, Chaine$
Next DeltaY
' Ecriture Conclusion
Print #2, "Allumés=" + Str$(NbPixels) + " (";
Print #2, Format$(NbPixels / 96 * 100, "##0.00") + "%)"
Print #2, ""
Next Caractere
' Fermeture Fichiers
Print #2, "
' Afficher Fichier de Sortie
Call Shell("notepad.exe """ + Fic$ + ".Log""", vbNormalFocus)
End Sub
C'est fait ? Bon, pour Word, remplacer "Fic$ = ThisWorkbook.Path" par "Fic$ = ThisDocument.Path", etc..
Tout va bien ? Alors placez le curseur n'importe où mais dans ce code (entre SUB et END SUB) et écrasez (gentiment) la touche "F5" du clavier. Si vous avez respecté les consignes, le bloc-notes devrait s'ouvrir et afficher le fichier résultat...
Enjoy !!
-MyLzz59-
Ca va encore mieux en le disant..
Important
## Comment "marche" ce Blog / Comment laisser un Commentaire ##
Et pour finir,
N'oubliez pas de visiter aussi
mon blog d'histoires ====>
-MyLzz59-
## Comment "marche" ce Blog / Comment laisser un Commentaire ##
Et pour finir,
N'oubliez pas de visiter aussi
mon blog d'histoires ====>
-MyLzz59-
mercredi 23 avril 2008
En Toutes Lettres 2
Inscription à :
Publier les commentaires (Atom)
13 Commentaire(s):
Merci d'avoir pensé à moi sur ce point...
Figure-toi que j'ai essayé de mettre en pratique tes explications...Et je ne m'en sors pas mieux :-(
Pfff, je suis à deux doigts de dijoncter ;-)
1/Impossible de sauvegarder le classeur avec Excel 2007...
(apparition du message d'erreur :
"The following feature cannot be saved in macro-free workbooks :.VB project"
2/Et puis, je suis certes pianiste mais une pianiste qui n'a jamais connu VB (mais plutôt du C++, Java et sur système embarqué) et qui s'est éloignée du piano depuis quelques missions...
3/Comme dirait celle du 5ème Élément: Please...heeelp!
Bisous,
Margouillat
Puisque tu fais du C++, tu n'auras aucun mal à transposer ce code, dont la routine noyau se contente de lire en accès direct un par un des octets dans le fichier source, de décomposer bit par bit ces octets, et d'écrire des chaînes dans un fichier de sortie séquentiel..
VB est le langage dont l'approche est de loin la plus facile, car il a conservé sa vocation première de langage initiatique pour débutants (B.A.S.I.C. = Beginners' All-purpose Symbolic Instruction Code), bien que ce soit un langage évolué et non marginal ou gadget, d'autant plus vrai avec VB7 = VB.Net ("Dot"Net, le Kro$oft concurrent de Java) Je pourrais en parler pendant des plombes, donc je préfère m'auto-censurer d'entrée, ce n'est pas le lieu ici ;-D
Je veux bien te fournir toute l'explication dont tu penses avoir besoin, mais pour cela pose-moi des questions précises afin que je cerne ce qui te laisse perplexe ;-)
Bisous Margouillat,
-MyLzz59-
mais moi suis sur Mac et z ai pas Office!et au boulot,ze manque de temps.
j avais essayé de faire un test en passant par un logiciel photo.style Corel..mais ça m a barbé rapidement ,enfin au bout de 2 heures.....suis quand même têtu!
merci (même si pour l instant je n en ai rien fait!)
Euh.. Y'a pas un langage de programmation sur ton joujou ? Ou un Word pour Mac (aïe, pas la tête..) Euh² j'ignore ce que vaut le basic de Sun StarOffice, et si ça existe pour ta Pomme ;-)
Salutations Spéciales Stéphane !!
-MyLzz59-
puis si j ai acheté ça , c est pour la simplicité!(la stabilité aussi)
effectivement,avec Open office ,y a peut etre une solution...
bises à toi
ps:moi l informatique c est tout au feeling,c est pas mon metier!
j'ai bien lu avec attention les deux derniers posts.... mais alors euh bon...... chuis une courge....j'ai aps compris à tout ça servait ! j ai aps imprimer l'image non plus.... parce que je suis sur un portl'imprimante est à l'autre bout de la maison....bon je voulais te dire..... suis super contente d evoir que tu as associé comme image à notre blog la photo de ma varadero.....
bisousssss
Y'a pas de honte à ne pas comprendre le baratin technique, ce serait ingérable s'il n'y avait que des "pianistes" sur cette planète ;-D
Rem: quand même, ça sert à faire fabriquer par l'ordinateur des images comme les ..sept exemples présentés dans la première partie de cet article ;-)
Bisous aussi,
-MyLzz59-
mais j'm'interesse t'as vu !!!rire
donc ,hier aprem',j etais desoeuvré au boulot( :-) ) ,j ai repris ton machin!
alors 1er souci:après avoir appelé l editeur,on le copie ou le code ?moi j ai une fenetre grise!doit me manquer une etape!
"petit" 2: qu est ce qu un repertoire?un dossier?donc on enregistre l image dans un dossier "Y" et la feuille excel aussi?
c est pas gagné!me tape pas! moi les ordis,je sais diagnostiquer des pannes et les demonter! apres.....
Répertoire=Dossier.
Donc oui, exact..
Bon courage, Taz, et n'hésite pas à poser d'autres questions..
Biz,
-MyLzz59-
toujours moi!(le boulet......)
donc evidemment....bmp pas trouvé!youpi!
est ce du au nom du fichier."bzzz"pour moi!!!faut il modifier le code avec ce nom?ou prendre "fic"(sais pas ce que ça veut dire),ou encore renseignerle nom du bmp quelquepart?
apres ça j ai un probleme de taille(pas moi! hein!)le fichier bmp mais la je dois pouvoir resoudre!on verra plus tard.
voila ,je te saoulerai jusqu au bout!faudra bien que ça marche!
fais gaffe au soleil!c est bien la Biafine! ;-)
c est reparti:
il y a eu incomprehension !moi je cherchais à obtenir l image "des mariées" ou autre d ailleurs....
en fait la, ça nous donne la correspondance pour chaque niveau de gris de pixel;donc ma question est :comment convertir une image quelconque comme tu l as fait pour les differents exemples que tu as proposés!
a+
le Taz!
*) soit tu voulais la soluce toute cuite, et là je risque de te décevoir; ma version actuelle n'est pas assez "user friendly" pour être "livrable" à un non-programmeur. Si je trouve le temps, je paufinerai le bestiau..
*) soit, et c'est ce que je crois, tu es impatient comme un mec (:-P) Pourtant, si tu regardes bien, tu as TOUT sous la main, reste plus qu'à reconstituer le Puzzle !
- Lecture d'une image source: cf la lecture de FIC.BMP, excepté que c'est du 256 gris (1 octet par pixel): tu as le code..
- Table de conversion: suffit de garder le résultat de la log obtenue..
- Ecriture de l'image finale: identique à la lecture de FIC.BMP, excepté l'ordre (PUT au lieu de GET, même syntaxe)
Bisous,
-MyLzz59-
Enregistrer un commentaire