From be81c0ae80f6cc766b60dc1d04019c9d9e23fe84 Mon Sep 17 00:00:00 2001 From: xdrm-brackets Date: Mon, 7 Sep 2015 19:21:32 +0200 Subject: [PATCH] unparse fini, il manque l'espace entre le HEADER et le CONTENT --- code/bmp.py | 9 ++++++ code/classes.py | 77 +++++++++++++++++++++++++++++++++++++++-------- code/classes.pyc | Bin 6277 -> 7492 bytes 3 files changed, 74 insertions(+), 12 deletions(-) diff --git a/code/bmp.py b/code/bmp.py index 4feb4ca..5d1f881 100644 --- a/code/bmp.py +++ b/code/bmp.py @@ -25,6 +25,15 @@ img.parse( sys.argv[1] ); #print img.content.readableData +print img.header.readableData + +print "\n\n\n" + +for byte in img.bin[:img.header.infoSize]: + print str(ord(byte)), + +print "\n\n\n" + for line in img.content.map: for pixel in line: diff --git a/code/classes.py b/code/classes.py index 05980e3..d5453c5 100644 --- a/code/classes.py +++ b/code/classes.py @@ -1,5 +1,6 @@ # ~*~ encoding: utf-8 ~*~ # +import binascii import sys ################################################# @@ -28,18 +29,13 @@ class BMPHeader: self.rowSize = 0; # longueur réelle d'une ligne self.padding = 0; # bourrage de fin de ligne (nb de bytes) - # convertit les octets en entier - def toInt(self, bytes): - intReturn = 0; - for i, byte in enumerate(bytes): - intReturn += ord(byte) * (256 ** i) - return intReturn # parse le header au format bin en objet def parse(self, binHeader): self.bin = binHeader # header brut (format initial: bin) self.signature = self.toInt(binHeader[ 0: 2]) # signature (4D42) self.fileSize = self.toInt(binHeader[ 2: 6]) # taille du fichier bmp (bytes) + # 4 empty bytes (empty value = 0) self.offset = self.toInt(binHeader[10:14]) # début de l'image (bytes) self.infoSize = self.toInt(binHeader[14:18]) # taille du INFO_HEADER self.width = self.toInt(binHeader[18:22]) # longueur de l'image (pixel) @@ -51,7 +47,7 @@ class BMPHeader: self.horiRes = self.toInt(binHeader[38:42]) # résolution horizontale (pixels) self.vertRes = self.toInt(binHeader[42:46]) # résolution verticale (pixels) self.colorNb = self.toInt(binHeader[46:50]) # nombre de couleurs de l'image (ou 0) - self.colorINb = self.toInt(binHeader[50:54]) # nombre d'images importantes (ou 0) + self.colorINb = self.toInt(binHeader[50:54]) # nombre de couleurs importantes de l'images (ou 0) # calculated values self.rowSize = self.size / self.height # taille réelle d'une ligne (+padding) @@ -61,7 +57,40 @@ class BMPHeader: self.readableData = "" for byte in binHeader: self.readableData += str(ord(byte)) + " " - + + + + + + + + # fonction qui créer à partir des attributs + def unparse(self): + bytes = [] + bytes += [ self.fromInt(self.signature, 2) ] # signature + bytes += [ self.fromInt(self.fileSize, 4) ] # taille fichier BMP + bytes += [ self.fromInt(0, 4) ] # 4 bytes inutilisés + bytes += [ self.fromInt(self.offset, 4) ] # début de l'image (bytes) + bytes += [ self.fromInt(self.infoSize, 4) ] # taille du INFO_HEADER + bytes += [ self.fromInt(self.width, 4) ] # longueur de l'image (pixels) + bytes += [ self.fromInt(self.height, 4) ] # hauteur de l'image (pixels) + bytes += [ self.fromInt(self.plans, 2) ] # nombre de plans (default: 1) + bytes += [ self.fromInt(self.bpp, 2) ] # nombre de bits par pixel (1,4,8, 24) + bytes += [ self.fromInt(self.compType, 4) ] # type de compression + bytes += [ self.fromInt(self.size, 4) ] # taille de la map (matrice de pixels) + bytes += [ self.fromInt(self.horiRes, 4) ] # résolution horizontale + bytes += [ self.fromInt(self.vertRes, 4) ] # résolution verticale + bytes += [ self.fromInt(self.colorNb, 4) ] # nombre de couleurs de l'image (ou 0) + bytes += [ self.fromInt(self.colorINb, 4) ] # nombre de couleurs importantes de l'image (ou 0) + + # human-readable data + self.readableData = "" + self.bin = ""; + for byte in bytes: + self.bin += byte + self.readableData += str(byte) + " " + + # Affiche au format humain, toutes les infos du header def info(self): print @@ -87,7 +116,30 @@ class BMPHeader: print "rowsize: %s" % ( hex(self.rowSize ) ) print "rowEncoded: %s" % ( hex(self.padding ) ) print "=====================" - print + print + + + # convertit les octets en entier + def toInt(self, bytes): + intReturn = 0; + for i, byte in enumerate(bytes): + intReturn += ord(byte) * (256 ** i) + return intReturn + + # écrit le valeur entière en octet bourrés jusqu'à la taille + def fromInt(self, intCode, N): + s = '0' + bin(intCode)[2:] + rtn = "" + while s != "": + rtn += chr( int(s[-8:], 2) ) + s = s[:-8] + + # on rajoute des zéros si besoin de padding + if N > len(rtn): + rtn = chr(int( "0" * ( N-len(rtn) ) )) + rtn + + return rtn + #################################################### @@ -156,9 +208,10 @@ class BMPContent: self.bin = "" for line in self.map[::-1]: for pixel in line: - self.bin += unichr(pixel.b) + unichr(pixel.g) + unichr(pixel.r) + self.bin += chr(pixel.b) + chr(pixel.g) + chr(pixel.r) for zero in range(0, padding): - self.bin += unichr(0) + self.bin += chr(0) + ################################# # classe contenant un pixel RGB # @@ -210,4 +263,4 @@ class BMPFile: # unparse à partir d'un et d'un def unparse(self): print "To Do !" - print "implement unparse function" \ No newline at end of file + print "implement unparse function" diff --git a/code/classes.pyc b/code/classes.pyc index 6de5c1c2b2456c0bc536facd19bdfd501887fb67..4e32847eb2445a624c0ff8ec258968a33115b5ca 100644 GIT binary patch delta 1979 zcmaJ?O>7%Q6n?X7d$X|}C;m-vQm0WutrVIRl{#uli%Bx}-5!#dsF zNU2CT=fU2p~8yD`Cs)z#;2M$OTC&Y;ZNL)}Q4xEq>TnOKrZJiQgZ11qz{O;h_2T0 z93v-5PP{#3l9M1OMUK^;f=d@UX>#l*Q${_0XKhlPQqSefRb)lJI=pn^dYqH;4D#r_ zb&KSsYU05UzX*|1Ul|kIf0=I>-C-PC4V$lep?W>x4u@Pq(|4+Tmsz&ifCbk(-BQ1Q_3uPl*^SzKaX%#Vk4_D9y;6-`C#V6Y5y0!lAU;r(I zkUbQkPkyDe3ALKE8KdMM;U|TtepH zaqshI(uOFga%R|){A!Yu>TKq4f%C{d2CXcuv3_+sGgTVJWXMIYxL!kVeAQi#njGhC zeYRccofcPFv@ZDBsdB^RB!kYc^F514O~8W2C5^s(0n?E`D?JKg$|UO}+Rl{vvhU4= zuKineAUjfco=ry>xE>iX!&DR|@O&3nz|o+>vJcB+>Wl2^=t=gRW;g+eTBuii%77y? zTmA`V9nNoTTSSK|T2bB4U5p=t{l{%HzbrtlSD2gSW9lB~q-lUW%Ft#|)7D&VczWRD z-$5T)eUcj}$~Nq7!JZV< zgLshg@Z?DZ^;#l`cMp0{5O1}3>a`~k1VMdoR$7;xZ@+ne^X7Z|?#zQ@ceL-R_=l&v zvrFvXqv7{FE`J_D;>+0zV{=F%Ovahi*nP(CF?My1GZ|$v!KA)t!VrVWB$Kf{lg4Bh zlPM<6JribeHe(&Y12!HF^CPgGFKvA6iHaF3y7^;=^8{=~M&Vn^Zv@oNswXWSzoG{r zAhx(3*nVIlbKF4K!J6j=oOVGp^uq7rg`x@#Rwvw`idMf1fpLQuc)6o#^ATMX(Ez`a z)9_X=42T@=EIKbdhpI0+?qz#H+MX!DM)o3{GvetHwEGqU<0jTBaA+B|&MWh$#>e4V zsu8gaXm-~UR9sXE2H|e^RGN-gJs6sqGh=26cDf((61eGJUV-zdnM z@O=9TeCi#{9ioUK0=i$Q$QUYeC0E1!4O~7IK~-XAUDUzuYY&}7gE&EO9KoWYs-cMg z95|5X0F``+OO>F3m^>U|cq&}WPwRE`zvy)G%N*72FHTLC(cqj$uu=$u2D&e)(s8wI zyNY-?ebG+=N_`|u93`j{)Zk6=6feMTaaQU48ZMPSkBp(~3of79W?biC|NA;r(JYh% rdIRYuJT4!s&~L3q=db$$IaVj2=0yYLnuMWBPm%_g)HAJ2Gn4oW&+@6k