Novembre 2024 | Lun | Mar | Mer | Jeu | Ven | Sam | Dim |
---|
| | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | | Calendrier |
|
|
| Structure des fichiers BMP/JPG/ICO | |
| | Auteur | Message |
---|
JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Structure des fichiers BMP/JPG/ICO Mar 11 Oct 2016 - 22:29 | |
| Pour qui voudrait s'intéresser à la structure d'un fichier image au format bmp, une petite sub qui dumpe le fichier et en détaille la structure (tout est en hexadécimal). En gros il y a une partie en-tête et une partie données qui détaille chaque pixel de l'image. L'en-tête donne les caractéristiques de l'image (format, taille, bits par pixel, etc.) La description des pixels est organisée de la façon suivante: - 3 ou 4 octets par pixel donnant sa couleur sous la forme B, G, R et éventuellement un octet supplémentaire. Les pixels sont décrits de bas en haut de l'image, et de gauche à droite. (les premiers octets de description correspondent au bas à gauche de l'image). La sub ne dumpe que le début du fichier qui peut être très long, on pourrait évidemment en rajouter.Le résultat est renvoyé sous forme de chaîne dans le presse-papier. Si ça peut amuser quelqu'un: - Code:
-
DIM f$,b$,i% f$ = "C:\GRAPH\BMP\PNoel.bmp": ' un fichier bmp quelconque HEIGHT 0,SCREEN_Y-30: WIDTH 0,450 LIST 1: FULL_SPACE 1: FONT_NAME 1,"Lucida Console" MEMO 2: HIDE 2: WIDTH 2,450 DumpBmp(f$) CLIPBOARD_PASTE 2 FOR i% = 1 TO COUNT(2): ITEM_ADD 1,ITEM_READ$(2,i%): NEXT i% END ' ============================================================================== SUB DumpBmp(f$,fr$) ' Dump d'un fichier image au format bitmap (bmp) ' -> Résultat dans fichier texte fr$ (ou clipboard si fr$ = "") ' NB: il peut y avoir un pixel supplémentaire (3 ou 4 octets à 00) en bout de ' chaque ligne...? IF LABEL("dpzb") = 0 THEN LABEL dpzb DIM_LOCAL sz%,a$,b$,rc$,i%,j%,nl%,rs%,w%,h%,bpp%,tb%,ad%,sad%,nb%,snb%,tx$,na%,fi% rc$ = CHR$(13)+CHR$(10) FILEBIN_OPEN_READ 1,f$: sz% = FILEBIN_SIZE(1) nl% = INT(sz%/2000): rs% = sz%-nl%*2000: a$ = "": ' lecture limitée à 2000 octets IF nl%>0 THEN FOR i% = 1 TO nl%: FILEBIN_HEXA_READ 1,2000,b$: a$ = a$+b$: NEXT i% IF rs% > 0 THEN FILEBIN_HEXA_READ 1,rs%,b$: a$ = a$+b$ FILEBIN_CLOSE 1 fi% = 0: IF fr$ <> "" THEN FILE_OPEN_WRITE 1,fr$: fi% = 1 na% = 4: ' nb de chiffres de l'adresse IF sz% > 1040000 na% = 6 ELSE IF sz% > 65500 THEN na% = 5 END_IF w% = HEX(MID$(a$,39,2)+MID$(a$,37,2)): h% = HEX(MID$(a$,47,2)+MID$(a$,45,2)) bpp% = HEX(MID$(a$,57,2)): ' bits par pixel b$ = f$+" ("+STR$(w%)+"x"+STR$(h%)+" pixels, "+STR$(sz%)+" octets)"+rc$+rc$ b$=b$+" - En-tête : -"+rc$ ad% = 0: nb% = 2: tx$ = "'BM'": GOSUB dpzb ad% = 2: nb% = 4: tx$ = "Taille totale du fichier": GOSUB dpzb ad% = 6: nb% = 4: tx$ = "Réservé": GOSUB dpzb ad% = 10: nb% = 4: tx$ = "Offset des datas images": GOSUB dpzb ad% = 14: nb% = 4: tx$ = "Taille du header": GOSUB dpzb ad% = 18: nb% = 4: tx$ = "Largeur image (pixels)": GOSUB dpzb ad% = 22: nb% = 4: tx$ = "Hauteur image (pixels)": GOSUB dpzb ad% = 26: nb% = 2: tx$ = "Nombre de plans": GOSUB dpzb ad% = 28: nb% = 2: tx$ = "Nb de bits par pixel (bpp)": GOSUB dpzb ad% = 30: nb% = 4: tx$ = "Type de compression": GOSUB dpzb ad% = 34: nb% = 4: tx$ = "Taille de l'image": GOSUB dpzb ad% = 38: nb% = 4: tx$ = "Largeur (pixels/m)": GOSUB dpzb ad% = 42: nb% = 4: tx$ = "Hauteur (pixels/m)": GOSUB dpzb ad% = 46: nb% = 4: tx$ = "Nombre de couleurs": GOSUB dpzb ad% = 50: nb% = 4: tx$ = "Couleurs importantes": GOSUB dpzb tb% = w%*h%*bpp%/8: ' taille de la zone bitmap b$=b$+rc$+" - Datas image ("+STR$(bpp%/8)+" octets/pixel = "+STR$(tb%)+" octets) : -" IF fi% = 1 FILE_WRITELN 1,b$: b$ = "" ELSE b$ = b$+rc$ END_IF nb% = sz%-54: ' octets restant (bitmap) ' Si nb%>tb%, un pixel fictif supplémentaire par ligne = (nb%-tb%)/h% octets à zéro. ad% = 54: tx$ = "" : GOSUB dpzb IF fi% = 0 CLIPBOARD_STRING_COPY b$ ELSE FILE_CLOSE 1 END_IF EXIT_SUB ' ++++++++++ dpzb: ' S/P extraction sous forme de dump d'une zone hexa de a$, d'adresse ad%, nb% octets, ' texte tx$ éventuel en commentaire -> ajouté à la chaîne b$ sad% = ad%: snb% = nb% WHILE nb%>16 b$ = b$+RIGHT$("00000"+HEX$(ad%),na%)+": " FOR i% = ad% TO ad%+15 b$ = b$+MID$(a$,2*i%+1,2)+" " NEXT i% IF tx$ <> "" THEN b$ = b$+" "+tx$ IF fi% = 1 FILE_WRITELN 1,b$: b$ = "" ELSE b$ = b$+rc$ END_IF ad% = ad%+16: nb% = nb%-16 END_WHILE IF nb% > 0 IF nb% = 2 THEN tx$ = " "+tx$ b$ = b$+RIGHT$("00000"+HEX$(ad%),na%)+": " FOR i% = ad% TO ad%+nb%-1 b$ = b$+MID$(a$,2*i%+1,2)+" " NEXT i% IF tx$ <> "" THEN b$ = b$+" "+tx$ IF fi% = 1 FILE_WRITELN 1,b$: b$ = "" ELSE b$ = b$+rc$ END_IF END_IF ad% = sad%: nb% = snb% RETURN END_SUB ' ============================================================================== SUB DumpIco(f$,fr$) ' Dump d'un fichier image au format bitmap (ico) ' -> Résultat dans fichier texte fr$ (ou clipboard si fr$ = "") ' Exemple de structure: ' 22 octets: header ' 104 octets: palette (?) ' 512 octets: bitmap image ' 128 octets: 1 octet par bit image (?) IF LABEL("dpzi") = 0 THEN LABEL dpzi DIM_LOCAL sz%,tl%,a$,b$,c$,rc$,i%,j%,w%,h%,bpp%,nl%,rs%,tb%,lp%,ad%,sad%,nb%,snb% DIM_LOCAL tx$,na%,fi% rc$ = CHR$(13)+CHR$(10) FILEBIN_OPEN_READ 1,f$: sz% = FILEBIN_SIZE(1) nl% = INT(sz%/2000): rs% = sz%-nl%*2000: a$ = "": ' lecture limitée à 2000 octets IF nl%>0 THEN FOR i% = 1 TO nl%: FILEBIN_HEXA_READ 1,2000,b$: a$ = a$+b$: NEXT i% IF rs% > 0 THEN FILEBIN_HEXA_READ 1,rs%,b$: a$ = a$+b$ FILEBIN_CLOSE 1 fi% = 0: IF fr$ <> "" THEN FILE_OPEN_WRITE 1,fr$: fi% = 1 na% = 4: ' nb de chiffres de l'adresse IF sz% > 1040000 na% = 6 ELSE IF sz% > 65500 THEN na% = 5 END_IF w% = HEX(MID$(a$,13,2)): h% = HEX(MID$(a$,15,2)) bpp% = HEX(MID$(a$,25,2)) b$ = f$+" ("+STR$(w%)+"x"+STR$(h%)+" pixels, "+STR$(sz%)+" octets)"+rc$+rc$ b$=b$+" - En-tête : -"+rc$ ad% = 0: nb% = 2: tx$ = "Réservé (=0000)": GOSUB dpzi ad% = 2: nb% = 2: tx$ = "=1 icône =2 curseur": GOSUB dpzi ad% = 4: nb% = 2: tx$ = "Nombre d'images": GOSUB dpzi ad% = 6: nb% = 1: tx$ = " Largeur (=0 si 256)": GOSUB dpzi ad% = 7: nb% = 1: tx$ = " Hauteur (=0 si 256)": GOSUB dpzi ad% = 8: nb% = 1: tx$ = " Nb de couleurs (=0 si >256)": GOSUB dpzi ad% = 9: nb% = 1: tx$ = " Réservé (=0)": GOSUB dpzi ad% = 10: nb% = 2: tx$ = "Nb de plans (0 ou 1)": GOSUB dpzi ad% = 12: nb% = 2: tx$ = "Bits par pixel (ou 0)": GOSUB dpzi ad% = 14: nb% = 4: tx$ = "Taille datas bitmap": GOSUB dpzi ad% = 18: nb% = 4: tx$ = "Offset datas bitmap": GOSUB dpzi lp% = HEX(MID$(a$,45,2)) b$=b$+rc$+" - Palette ? (= "+STR$(lp%)+" octets) : -"+rc$ ad% = 22: nb% = lp%: tx$ = "": GOSUB dpzi tb% = w%*h%*bpp%/8: ' taille des données bitmap de l'image b$=b$+rc$+" - Datas image ("+STR$(bpp%/8)+" octets/pixel = "+STR$(tb%)+" octets) : -"+rc$ ad% = ad%+lp%: nb% = tb%: tx$ = "": GOSUB dpzi b$ = b$+rc$+" - Zone "+STR$(sz%-62-tb%)+" octets (= 1 octet pour 6 pixels image ?) -"+rc$ ad% = ad%+tb%: nb% = sz%-ad%: tx$ = "": GOSUB dpzi IF fr$ = "" CLIPBOARD_STRING_COPY b$ ELSE FILE_WRITELN 1,b$: FILE_CLOSE 1 END_IF EXIT_SUB ' ++++++++++ dpzi: ' S/P extraction sous forme de dump d'une zone hexa de a$, d'adresse ad%, nb% octets, ' texte tx$ éventuel en commentaire -> ajouté à la chaîne b$ sad% = ad% WHILE nb%>16 b$ = b$+RIGHT$("00000"+HEX$(ad%),na%)+": " FOR i% = ad% TO ad%+15 b$ = b$+MID$(a$,2*i%+1,2)+" " NEXT i% IF tx$ <> "" THEN b$ = b$+" "+tx$ b$ = b$+rc$ ad% = ad%+16: nb% = nb%-16 END_WHILE IF nb% > 0 IF nb% = 2 THEN tx$ = " "+tx$ b$ = b$+RIGHT$("00000"+HEX$(ad%),na%)+": " FOR i% = ad% TO ad%+nb%-1 b$ = b$+MID$(a$,2*i%+1,2)+" " NEXT i% IF tx$ <> "" THEN b$ = b$+" "+tx$ b$ = b$+rc$ END_IF ad% = sad% RETURN END_SUB ' ============================================================================== SUB DumpJpg(f$,fr$) ' Dump d'un fichier image au format jpg ' -> Résultat dans fichier texte fr$ (ou clipboard si fr$ = "") ' Structure détaillée: ' http://dev.exiv2.org/projects/exiv2/wiki/The_Metadata_in_JPEG_files DIM_LOCAL sz%,tl%,a$,b$,c$,d$,rc$,i%,j%,w%,h%,bpp%,nl%,rs%,tb%,lf%,sf%,ad%,sad% DIM_LOCAL nb%,snb%,tx$,na%,fi% IF LABEL("dpzj") = 0 THEN LABEL dpzj rc$ = CHR$(13)+CHR$(10) FILEBIN_OPEN_READ 1,f$: sz% = FILEBIN_SIZE(1) nl% = INT(sz%/2000): rs% = sz%-nl%*2000: a$ = "": ' lecture limitée à 2000 octets IF nl%>0 THEN FOR i% = 1 TO nl%: FILEBIN_HEXA_READ 1,2000,b$: a$ = a$+b$: NEXT i% IF rs% > 0 THEN FILEBIN_HEXA_READ 1,rs%,b$: a$ = a$+b$ FILEBIN_CLOSE 1 fi% = 0: IF fr$ <> "" THEN FILE_OPEN_WRITE 1,fr$: fi% = 1 na% = 4: ' nb de chiffres de l'adresse IF sz% > 1040000 na% = 6 ELSE IF sz% > 65500 THEN na% = 5 END_IF b$ = f$+" ("+STR$(sz%)+" octets)"+rc$+rc$ b$=b$+" - En-tête : -"+rc$ ad% = 0: nb% = 2: tx$ = "Start Of Image": GOSUB dpzj ad% = ad%+nb% c$ = MID$(a$,ad%*2+1,2)+MID$(a$,ad%*2+3,2) WHILE LEFT$(c$,2) = "FF": ' Start Of Frame d$ = "" IF RIGHT$(c$,2) = "C0": ' Frame de dimensions h% = 256*HEX(MID$(a$,ad%*2+11,2))+HEX(MID$(a$,ad%*2+13,2)) w% = 256*HEX(MID$(a$,ad%*2+15,2))+HEX(MID$(a$,ad%*2+17,2)) d$ = " (image="+STR$(w%)+"x"+STR$(h%)+" pixels)" ELSE IF RIGHT$(c$,2) = "E1" THEN d$ = " (Exifs)" END_IF nb% = 2: tx$ = "Start Of Frame"+d$: GOSUB dpzj ad% = ad%+2 i% = ad%*2+1: lf% = HEX(MID$(a$,i%,2))*256+HEX(MID$(a$,i%+2,2)): ' longueur de frame nb% = lf%: tx$ = "": GOSUB dpzj ad% = ad%+nb% c$ = MID$(a$,ad%*2+1,2)+MID$(a$,ad%*2+3,2) END_WHILE b$=b$+" - Datas : -" IF fi% = 1 FILE_WRITELN 1,b$: b$ = "" ELSE b$ = b$+rc$ END_IF nb% = sz%-ad%: tx$ = "": GOSUB dpzj IF fi% = 0 CLIPBOARD_STRING_COPY b$ ELSE FILE_CLOSE 1 END_IF EXIT_SUB ' ++++++++++ dpzj: ' S/P extraction sous forme de dump d'une zone hexa de a$, d'adresse ad%, nb% octets, ' texte tx$ éventuel en commentaire -> ajouté à la chaîne b$ sad% = ad%: snb% = nb% WHILE nb%>16 b$ = b$+RIGHT$("00000"+HEX$(ad%),na%)+": ": item_add 1,RIGHT$("0000"+HEX$(ad%),5)+": " FOR i% = ad% TO ad%+15 b$ = b$+MID$(a$,2*i%+1,2)+" " NEXT i% IF tx$ <> "" THEN b$ = b$+" "+tx$ IF fi% = 1 FILE_WRITELN 1,b$: b$ = "" ELSE b$ = b$+rc$ END_IF ad% = ad%+16: nb% = nb%-16 END_WHILE IF nb% > 0: ' reste IF nb% = 2 THEN tx$ = " "+tx$ b$ = b$+RIGHT$("00000"+HEX$(ad%),na%)+": " FOR i% = ad% TO ad%+nb%-1 b$ = b$+MID$(a$,2*i%+1,2)+" " NEXT i% IF tx$ <> "" THEN b$ = b$+" "+tx$ IF fi% = 1 FILE_WRITELN 1,b$: b$ = "" ELSE b$ = b$+rc$ END_IF END_IF ad% = sad%: nb% = snb% RETURN END_SUB ' ============================================================================== Je voudrais faire la même chose avec les fichiers ICO, mais là c'est un peu plus coton... 12/10 ajouté la sub DumpIco() pour les fichiers .ico 15/10 ajouté la sub DumpJpg() pour les images .jpg 16/10 possibilité du résultat dans un fichier au lieu du presse-papier
Dernière édition par JL35 le Dim 16 Oct 2016 - 20:18, édité 6 fois | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Structure des fichiers BMP/JPG/ICO Mer 12 Oct 2016 - 0:06 | |
| Bravo JL35. C’est toujours intéressant de connaitre ça - Pour faire le connaisseur
Tu peux ajouter la taille totale en octet et en Ko Pour cela, ajouter dans la SUB - Code:
-
Dim_local taille_octet Et après l’instruction FILEBIN_HEXA_READ 1,tl%,a$ Ajouter (Attention : les 4 octets codant la taille sont inversés !!! taille_octet = hex(MID$(a$,11,2)+MID$(a$,9,2) + MID$(a$,7,2) + mid$(a$,5,2)) et 2 lignes apès, ajouter b$ =b$+"Taille totale en octet : " + str$(taille_octet) + " : soit "+str$(int(taille_octet/1024))+" Ko"+rc$+rc$
| |
| | | Minibug
Nombre de messages : 4570 Age : 58 Localisation : Vienne (86) Date d'inscription : 09/02/2012
| Sujet: Re: Structure des fichiers BMP/JPG/ICO Mer 12 Oct 2016 - 7:22 | |
| intéressant. Merci JL35 ! Il faut que je prenne le temps de regarder en détail. | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Structure des fichiers BMP/JPG/ICO Mer 12 Oct 2016 - 16:07 | |
| bonjour papydall,
Dans la sub on a aussi directement la taille totale avec sz%: STR$(sz%).
Remarque importante: j'ai oublié de préciser que dans le fichier bmp, les données numériques sont écrites en 'little endian', c'est à dire les poids faibles en tête.
Par exemple, une valeur sur 2 octets, en hexadécimal: D3 01 = 01D3 (= 467 en décimal) Une valeur sur 4 octets: 2C 1B 0A 00 = 0A1B2C (= 662316 en décimal) | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Structure des fichiers BMP/JPG/ICO Mer 12 Oct 2016 - 16:26 | |
| - JL35 a écrit:
- Remarque importante: j'ai oublié de préciser que dans le fichier bmp, les données numériques sont écrites en 'little endian', c'est à dire les poids faibles en tête.
C’est ce que j’ai précisé dans mon SPOILER Pour faire le connaisseurMais comme tout le monde n’est pas aussi connaisseur que Papydall, … HiHiHi | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Structure des fichiers BMP/JPG/ICO Mer 12 Oct 2016 - 16:34 | |
| Dont acte papydall, tu as bien précisé dans 'Pour faire le connaisseur' que tous les octets codant la taille sont inversés.
Et moi, Pour faire le malin, je précise que TOUTES les données enregistrés dans l'en-tête, sur 2 ou 4 octets sont en ordre inverse ! en little endian, pour rappeler des souvenirs aux vieux programmeurs en assembleur. | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Structure des fichiers BMP/JPG/ICO Mer 12 Oct 2016 - 16:58 | |
| J’ai flirté avec le Litte-endian, le Big-endian en passant par le Middle-endian, sans oublier le Bi-endian qu’on appelait bytesexual. A malin, malin et demi!
| |
| | | Minibug
Nombre de messages : 4570 Age : 58 Localisation : Vienne (86) Date d'inscription : 09/02/2012
| Sujet: Re: Structure des fichiers BMP/JPG/ICO Mer 12 Oct 2016 - 18:06 | |
| | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Structure des fichiers BMP/JPG/ICO Mer 12 Oct 2016 - 20:07 | |
| L'indien c'est papydall, attention à ses flèches qui peuvent être acérées ! Ceci dit, j'ai modifié légèrement la sub DumpBmp() et ajouté une sub DumpIco() pour les fichiers images .ico. C'est un format assez complexe, et ce qui n'arrange rien c'est qu'il peut y avoir plusieurs images icônes dans le même fichier ! Et je n'ai pas (encore ?) trouvé la signification de certaines zones. Alors le dump est assez rustique, pour des icônes simples, et il y a sûrement des cas où le résultat serait à prendre avec circonspection. J'ai bien trouvé ça: http://www.gladir.com/LEXIQUE/FICHIERS/ico.htm mais ce n'est pas très clair quand même pour ma petite tête... Pour les deux dumps je traite maintenant l'intégralité du fichier (qui tient donc dans une seule chaîne sous forme hexa), donc c'est fait pour des imagettes genre icônes, plus gros ça risquerait de faire exploser la machine. | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Structure des fichiers BMP/JPG/ICO Sam 15 Oct 2016 - 17:20 | |
| Je viens d'ajouter le dump des fichiers images au format jpg. Je répète que c'est pour de petits fichiers images (quelques milliers d'octets), au-delà ça peut marcher encore mais le temps d'exécution devient vite assez long. Et dans ce cas il faudrait modifier les subs pour renvoyer le résultat dans un fichier texte par exemple, plutôt que dans le presse-papier.
| |
| | | jjn4
Nombre de messages : 2747 Date d'inscription : 13/09/2009
| Sujet: +++ Dim 16 Oct 2016 - 18:10 | |
| Ouh, encore du grand JL35, ça ! Et ça devient de plus en plus ample. (bientôt, il va d'ailleurs nous rajouter les musiques, les vidéos...) | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Structure des fichiers BMP/JPG/ICO Dim 16 Oct 2016 - 20:24 | |
| Tiens jj, content de te voir, ça va ?
Pour les musiques et vidéos, là c'est un peu plus duraille, et je ne suis pas sûr que ça intéresse grand monde ! On a déjà parlé du format mp3 quelque part (avec ygeronimi ?), je ne sais plus trop où...
Sinon là-haut j'ai ajouté la possibilité de récupérer le résultat du dump dans un fichier texte, en effet, dès que le fichier image est un peu grand ça devient rédhibitoire par le presse-papier. Le résultat du dump en hexa est environ 3,5 fois plus volumineux que le fichier source lui-même. | |
| | | Contenu sponsorisé
| Sujet: Re: Structure des fichiers BMP/JPG/ICO | |
| |
| | | | Structure des fichiers BMP/JPG/ICO | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |