From 9a9101ed7766a190a86212d3f6d0cad64c8a2eec Mon Sep 17 00:00:00 2001 From: xdrm-brackets Date: Tue, 8 Sep 2015 21:17:00 +0200 Subject: [PATCH] =?UTF-8?q?Parsing=20et=20Unparsing=20termin=C3=A9s=20et?= =?UTF-8?q?=20fonctionnel,=20sortie=20vers=20autre=20fichier=20avec=20modi?= =?UTF-8?q?fication=20fonctionne.\nReste=20=C3=A0=20modifier=20le=20header?= =?UTF-8?q?=20en=20fonction=20du=20parsage=20du=20content=20(ex:=20width,?= =?UTF-8?q?=20height,=20...).=20Enfin=20git=20status!?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- code/bmp.py | 40 ++++++++++++++++++++-------------- code/bmp.readme | 12 +++++------ code/classes.py | 53 +++++++++++++++++++++++++++++++--------------- code/classes.pyc | Bin 0 -> 8216 bytes code/overwrite.py | 50 ------------------------------------------- 5 files changed, 65 insertions(+), 90 deletions(-) create mode 100644 code/classes.pyc delete mode 100644 code/overwrite.py diff --git a/code/bmp.py b/code/bmp.py index 56462a6..ebd1443 100644 --- a/code/bmp.py +++ b/code/bmp.py @@ -8,24 +8,32 @@ from classes import * import sys +# lecture du fichier +with open( sys.argv[1] ) as file: + binFile = file.read() + +# Instanciation du BMPFile img = BMPFile() -img.parse( sys.argv[1] ); - - -### print header human-readable data ### -#print img.header.info() - -### print file human-readable data ### -#print img.intData - -### print header human-readable data ### -#print img.header.intData - -### print content human-readable data ### -#print img.content.intData + +# Parsing +img.parse( binFile ); +# MODIFICATIONS des pixels for line in img.content.map: for pixel in line: - print "rgb(%s, %s, %s)" % (pixel.r, pixel.g, pixel.b) - print \ No newline at end of file + pixel.r = 255 + pixel.g = 75 + pixel.b = 255 + + +# Unparsing +img.unparse() + + +print img.binData + +# for line in img.content.map: +# for pixel in line: +# print "rgb(%s, %s, %s)" % (pixel.r, pixel.g, pixel.b) +# print \ No newline at end of file diff --git a/code/bmp.readme b/code/bmp.readme index 65c5181..3cd7457 100644 --- a/code/bmp.readme +++ b/code/bmp.readme @@ -85,15 +85,13 @@ Classes: /***************/ /* ATTRIBUTS */ /***************/ - * CONTENU BRUT HEADER COMPLETS (début jusqu'aux pixels) - - header format binaire (0 à offset) - - header format list de (0-255) - - header format liste de (0x00 - 0xFF) + * CONTENU PALETTE (fin du header jusqu'aux pixels) + - palette format binaire (header à offset) + - palette format list de (0-255) * CONTENU BRUT - contenu complet brut (binaire) - contenu complet format liste de (0-255) - - contenu complet format liste de (0x00 - 0xFF) * CONTENU STRUCTURE -
objet de type @@ -106,8 +104,8 @@ Classes: parse(binFile=""): Définit les attributs à partir de ou de l'argument si défini - unparse(header="", content=""): - Définit à partir d'un
et d'un + unparse(): + Définit à partir des attributs et diff --git a/code/classes.py b/code/classes.py index 078462f..cef9483 100644 --- a/code/classes.py +++ b/code/classes.py @@ -58,7 +58,7 @@ class BMPHeader: 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) @@ -69,11 +69,6 @@ class BMPHeader: self.intData.append( ord(byte) ) - - - - - # fonction qui créer à partir des attributs def unparse(self): @@ -95,7 +90,7 @@ class BMPHeader: 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) - + self.binData = "" for byte in self.intData: @@ -213,7 +208,7 @@ class BMPContent: # human-readable data self.intData = [] for byte in self.binData: - self.intData.append( ord( byte ) ) + self.intData.append( ord( byte ) ) # unparse une map de pixels en binaire @@ -223,13 +218,18 @@ class BMPContent: height = len( map ) # nb de lignes = taille de la map width = len( map[0] ) # nb de colonnes = taille des lignes de la map padding = ( 4 - width*3 % 4 ) % 4 # padding de bourrage de lignes - - self.bin = "" + + + self.binData = "" for line in self.map[::-1]: for pixel in line: - self.bin += chr(pixel.b) + chr(pixel.g) + chr(pixel.r) + self.binData += chr(pixel.b) + chr(pixel.g) + chr(pixel.r) for zero in range(0, padding): - self.bin += chr(0) + self.binData += chr(0) + + self.intData = [] + for byte in self.binData: + self.intData.append( ord(byte) ) ################################# @@ -258,11 +258,9 @@ class BMPFile: # human-readable data self.binData = binFile self.intData = [] - self.hexData = [] for byte in binFile: - self.intData.append( ord(byte) ) - self.hexData.append( hex( ord(byte) ) ) + self.intData.append( ord(byte) ) headerSize = 54 @@ -274,7 +272,28 @@ class BMPFile: self.content = BMPContent() self.content.parse( self.binData[self.header.offset:], self.header ) + # création de la pallette (header complémentaire=définition des couleurs+codage) + self.binPalette = self.binData[54:self.header.offset] + self.intPalette = [] + for byte in self.binPalette: + self.intPalette.append( ord(byte) ) + # unparse à partir d'un et d'un def unparse(self): - print "To Do !" - print "implement unparse function" + # on définit la palette par défaut + self.intPalette = [66, 71, 82, 115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] + + self.binPalette = "" + for byte in self.intPalette: + self.binPalette += chr(byte) + + # on déparse les classes utilisées + self.content.unparse( self.content.map ) + self.header.unparse() + + # on enregistre le contenu brut binaire du fichier complet + self.binData = "%s%s%s" % (self.header.binData, self.binPalette, self.content.binData) + + self.intData = [] + for byte in self.binData: + self.intData.append( ord(byte) ) \ No newline at end of file diff --git a/code/classes.pyc b/code/classes.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d1baa73707b84edc62b080be1fd4aa59bfb65186 GIT binary patch literal 8216 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