From 4b15aad1554dc164e5ac547545cc1f24895a0b21 Mon Sep 17 00:00:00 2001 From: xdrm-brackets Date: Mon, 7 Sep 2015 23:12:42 +0200 Subject: [PATCH] correction des classes en fonction du readme pas fini au niveau du (unparse BMPHeader) --- code/bmp.py | 16 +---- code/classes.py | 174 ++++++++++++++++++++++++++--------------------- code/classes.pyc | Bin 7501 -> 7945 bytes 3 files changed, 101 insertions(+), 89 deletions(-) diff --git a/code/bmp.py b/code/bmp.py index 5d1f881..56462a6 100644 --- a/code/bmp.py +++ b/code/bmp.py @@ -16,23 +16,13 @@ img.parse( sys.argv[1] ); #print img.header.info() ### print file human-readable data ### -#print img.readableData +#print img.intData ### print header human-readable data ### -#print img.header.readableData +#print img.header.intData ### print content human-readable data ### -#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" +#print img.content.intData for line in img.content.map: diff --git a/code/classes.py b/code/classes.py index 72255b1..b3bf4ec 100644 --- a/code/classes.py +++ b/code/classes.py @@ -9,9 +9,13 @@ class BMPHeader: # CONSTRUCTEUR: initialise les variables def __init__(self): - self.bin = 0; # header brut (format initial: bin) + self.binData = 0; # header brut (format initial: bin) + self.intData = 0; # header brut (format entier) + self.hexData = 0; # header brut (format hexadécimal) + self.signature = 0; # signature (4D42) self.fileSize = 0; # taille du fichier bmp (bytes) + self.offset = 0; # début de l'image (bytes) self.infoSize = 0; # taille du INFO_HEADER self.width = 0; # longueur de l'image (pixel) @@ -30,32 +34,41 @@ class BMPHeader: # 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) + def parse(self, binHeader=""): + # on utilise l'argument si on l'a sinon l'attribut + if binHeader != "": + parsingData = binHeader + else: + parsingData = self.binData + + self.binData = parsingData.join("") # header brut (format initial: bin) + + self.signature = self.toInt( parsingData[ 0: 2] ) # signature (4D42) + self.fileSize = self.toInt( parsingData[ 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) - self.height = self.toInt(binHeader[22:26]) # hauteur de l'image (pixel) - self.plans = self.toInt(binHeader[26:28]) # nombre de plans (default: 1) - self.bpp = self.toInt(binHeader[28:30]) # nombre de bits par pixel (1,4,8, 24) - self.compType = self.toInt(binHeader[30:34]) # type de compression (0=none, 1=RLE-8, 2=RLE-4) - self.size = self.toInt(binHeader[34:38]) # taille de l'image avec padding (bytes) - 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 de couleurs importantes de l'images (ou 0) + self.offset = self.toInt( parsingData[10:14] ) # début de l'image (bytes) + self.infoSize = self.toInt( parsingData[14:18] ) # taille du INFO_HEADER + self.width = self.toInt( parsingData[18:22] ) # longueur de l'image (pixel) + self.height = self.toInt( parsingData[22:26] ) # hauteur de l'image (pixel) + self.plans = self.toInt( parsingData[26:28] ) # nombre de plans (default: 1) + self.bpp = self.toInt( parsingData[28:30] ) # nombre de bits par pixel (1,4,8, 24) + self.compType = self.toInt( parsingData[30:34] ) # type de compression (0=none, 1=RLE-8, 2=RLE-4) + self.size = self.toInt( parsingData[34:38] ) # taille de l'image avec padding (bytes) + self.horiRes = self.toInt( parsingData[38:42] ) # résolution horizontale (pixels) + self.vertRes = self.toInt( parsingData[42:46] ) # résolution verticale (pixels) + self.colorNb = self.toInt( parsingData[46:50] ) # nombre de couleurs de l'image (ou 0) + self.colorINb = self.toInt( parsingData[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) self.padding = self.rowSize - self.width*self.bpp/8 # bourrage (nb de bytes) - self.readableData = "" - for byte in binHeader: - self.readableData += str(ord(byte)) + " " + self.intData = [] + self.hexData = [] + for byte in parsingData: + self.intData.append( ord(byte) ) + self.hexData.append( hex( ord(byte) ) ) @@ -65,60 +78,65 @@ class BMPHeader: # fonction qui créer à partir des attributs def unparse(self): - - # pas de gestion du header complémentaire - self.infoSize = 54 - self.offset = 54 - - 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) + + self.binData = "" + + self.fromInt( self.signature, 2) # signature + self.fromInt( self.fileSize, 4) # taille fichier BMP + self.fromInt( 0, 4) # 4 bytes inutilisés + self.fromInt( self.offset, 4) # début de l'image (bytes) + self.fromInt( self.infoSize, 4) # taille du INFO_HEADER + self.fromInt( self.width, 4) # longueur de l'image (pixels) + self.fromInt( self.height, 4) # hauteur de l'image (pixels) + self.fromInt( self.plans, 2) # nombre de plans (default: 1) + self.fromInt( self.bpp, 2) # nombre de bits par pixel (1,4,8, 24) + self.fromInt( self.compType, 4) # type de compression + self.fromInt( self.size, 4) # taille de la map (matrice de pixels) + self.fromInt( self.horiRes, 4) # résolution horizontale + self.fromInt( self.vertRes, 4) # résolution verticale + self.fromInt( self.colorNb, 4) # nombre de couleurs de l'image (ou 0) + 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) + " " + self.intData = [] + self.hexData = [] + for byte in self.binData: + self.intData.append( str( ord( byte ) ) ) + self.hexData.append( hex( ord( byte ) ) ) # Affiche au format humain, toutes les infos du header - def info(self): + def info(self, type=0): # 0 = int, 1 = hex + + if type == 0: # si int + def displayType(value): + return value + else: + def displayType(value): + return hex(value) + print print "INFORMATION DU HEADER" print "=====================" - print "signature: %s" % ( hex(self.signature) ) - print "taille du fichier: %s" % ( hex(self.fileSize ) ) - print "offset du contenu: %s" % ( hex(self.offset ) ) - print "taille infoHeader: %s" % ( hex(self.infoSize ) ) - print "largeur: %s" % ( hex(self.width ) ) - print "hauteur: %s" % ( hex(self.height ) ) - print "nombre de plans: %s" % ( hex(self.plans ) ) - print "bits par pixel: %s" % ( hex(self.bpp ) ) - print "type compression: %s" % ( hex(self.compType ) ) - print "taille(+padding): %s" % ( hex(self.size ) ) - print "horizontal resol: %s" % ( hex(self.horiRes ) ) - print "vertical resol: %s" % ( hex(self.vertRes ) ) - print "nombre de couleur: %s" % ( hex(self.colorNb ) ) - print "nb couleurs impor: %s" % ( hex(self.colorINb ) ) + print "signature: %s" % displayType( self.signature ) + print "taille du fichier: %s" % displayType( self.fileSize ) + print "offset du contenu: %s" % displayType( self.offset ) + print "taille infoHeader: %s" % displayType( self.infoSize ) + print "largeur: %s" % displayType( self.width ) + print "hauteur: %s" % displayType( self.height ) + print "nombre de plans: %s" % displayType( self.plans ) + print "bits par pixel: %s" % displayType( self.bpp ) + print "type compression: %s" % displayType( self.compType ) + print "taille(+padding): %s" % displayType( self.size ) + print "horizontal resol: %s" % displayType( self.horiRes ) + print "vertical resol: %s" % displayType( self.vertRes ) + print "nombre de couleur: %s" % displayType( self.colorNb ) + print "nb couleurs impor: %s" % displayType( self.colorINb ) print "=====================" print "INFORMATIONS COMP." print "=====================" - print "rowsize: %s" % ( hex(self.rowSize ) ) - print "rowEncoded: %s" % ( hex(self.padding ) ) + print "rowsize: %s" % displayType( self.rowSize ) + print "rowEncoded: %s" % displayType( self.padding ) print "=====================" print @@ -127,22 +145,26 @@ class BMPHeader: def toInt(self, bytes): intReturn = 0; for i, byte in enumerate(bytes): - intReturn += ord(byte) * (256 ** i) + intReturn += ord(byte) * (256 ** i) + return intReturn - # écrit le valeur entière en octet bourrés jusqu'à la taille + # écrit le valeur entière en octet bourrés jusqu'à la taille def fromInt(self, value, size): - s = '0' + bin(value)[2:] - rtn = "" + s = '0' + str( bin(value)[2:] ) + + temp = "" + 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" * (size - len(rtn)) )) + rtn - - return rtn + print chr( int(s[:8], 2) ) + temp += chr( int(s[:8], 2) ) + s = s[8:] + print temp + + if size > len(temp): + temp = chr(int('0' * (size-len(temp)), 2) ) + temp + + self.binData += temp @@ -154,7 +176,7 @@ class BMPContent: # CONSTRUCTEUR: instancie les attribus def __init__(self): self.map = [] - self.bin = "" + self.binData = "" self.readableData = "" # parse le content (bin) avec les informations: diff --git a/code/classes.pyc b/code/classes.pyc index 73517bcc445da3b73e41ee63225ff62fc4991f1c..8342d9d7af808db25c10aec0081d4a1880171cf2 100644 GIT binary patch literal 7945 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 delta 3045 zcmaJ@OK%%h6h7CFamJ50u^lIklco(Rb*WlPRW-CgD>WevT@-Yyswxty9FLoho7$;8 z2qPtUQ3UD&)OI9M<&bgVfTj9!?ljHN9d+&LC z_l$3!dU(=`{*y_b`{l0nSyBI~tn9jQpR33%!q7W-?W9xTSQr%g$EBjfWh^?x;2d}g6 zEZ}MXgcvszZ4h07LR5#Ya55p-y|)Yy=>sAhd;mm4z~NMoM1aIXgsqMh0`WcoX(vL! z>H`ww423`<1n$Mgx+XlEoMh-=hYoCYQX!D+15)IqLm<@$q{+#IK)MgekTVw!<5hFAt-VC_H*#2turLEeEW3_Sw_rw48dS`Wm)?0&3kZu3q( z!R~(W2@C`uh=Jn$8169lF3Xphl@aP3H;g?TG8QzC(0rtBSRbor$s66FFYZ5cH%m8v z+~IBl%sB5Jhcw)cv4)2Vc02(Ng1)!6h6B|vi8)6eN;we4W9!}%N~pPwhTg_T}H1V zqJ%rgoRh0sge4YOcHPTd_RR8|q2tiUN2SQ3FH9$1C~ixpVxz>)|o$-pucSWq0Vl6 zm5JqI=GDA+TMe0sF7sijTLg-NP??r|D7`mjweBD*#`QQR|bPr93A4 zpos!-{K0V?n=}wd46~nOJTK`Skqac(#{GADd%MilF%zGYsa`X495s-6zE*3<;(cbI z^Q8i`&~$3Do7uB1t}UFZ}L{8 zYX(A=_vBZQFre0PJ1Uh=w20>$fY!GEDRJ3fama`2kls7c`KZb!Hj=iKjaeOr7@UFOtWv|+m} z+i*Z8G~w^_ya#J5B3DJW^if!hzYtdzNm3lOiScEBapH2E>-*5ZKQTLYh!GxTy07|N z?xKDX*3a>@d9@X_6ZS!U%s;VfeePBEe}%>p3H?06pn%@Y9N}Pqv z{A#n|VTHT|dbeA8dDR7-D>rJg9e>fPV!Z