From d223aa19020fa77c7b59f91dc12a9df8ccb8e541 Mon Sep 17 00:00:00 2001 From: xdrm-brackets Date: Tue, 8 Sep 2015 22:42:28 +0200 Subject: [PATCH] =?UTF-8?q?BMPContent=20unparse=20cr=C3=A9=C3=A9=20le=20he?= =?UTF-8?q?ader=20(via=20handler)=20et=20la=20cr=C3=A9ation=20d'une=20imag?= =?UTF-8?q?e=20manuellement=20(par=20cr=C3=A9ation=20de=20la=20map=20uniqu?= =?UTF-8?q?ement)=20fonctionne=20et=20cr=C3=A9=C3=A9e=20bien=20un=20fichie?= =?UTF-8?q?r=20viable?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- code/bmp.py | 60 ++++++++++++++++++++++++++++++++----------------- code/bmp.readme | 19 ++++++++++++++-- code/classes.py | 47 +++++++++++++++++++++++++++++++------- 3 files changed, 95 insertions(+), 31 deletions(-) diff --git a/code/bmp.py b/code/bmp.py index ebd1443..bf64956 100644 --- a/code/bmp.py +++ b/code/bmp.py @@ -5,35 +5,53 @@ # classes from classes import * - +import random import sys -# lecture du fichier -with open( sys.argv[1] ) as file: - binFile = file.read() -# Instanciation du BMPFile -img = BMPFile() +def testFileIntegrity(): + # lecture du fichier + with open( sys.argv[1] ) as file: + binFile = file.read() -# Parsing -img.parse( binFile ); + # Instanciation du BMPFile + img = BMPFile() + + # Parsing + img.parse( binFile ); + + # MODIFICATIONS des pixels + for line in img.content.map: + for pixel in line: + pixel.r = 255 + pixel.g = 75 + pixel.b = 255 -# MODIFICATIONS des pixels -for line in img.content.map: - for pixel in line: - pixel.r = 255 - pixel.g = 75 - pixel.b = 255 + # Unparsing + img.unparse() -# Unparsing -img.unparse() + print img.binData -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 + + +def testManualCreation(): + img = BMPFile() + for y in range(0, 100): + img.content.map.append( [] ) + for x in range(0, 100): + img.content.map[y].append( RGBPixel( + random.randint(0, 255), + random.randint(0, 255), + random.randint(0, 255) + ) ); + + img.unparse(); + + print img.binData + +# MAIN +testManualCreation() \ No newline at end of file diff --git a/code/bmp.readme b/code/bmp.readme index 3cd7457..0ed10de 100644 --- a/code/bmp.readme +++ b/code/bmp.readme @@ -74,8 +74,8 @@ Classes: parse(binContent="", header): Définit les attributs à partir de ou de l'argument si défini ainsi que du header - unparse(): - Définit à partir map + unparse(headerHandler=None): + Définit à partir map et définit aussi l'objet s'il est passé en paramètres @@ -129,3 +129,18 @@ Classes: Constructeur(r, g, b): Définit les attributs + + + + + + + + + + + +############# +## To Do ## +############# +[x] faire que le unparse du content créée le header \ No newline at end of file diff --git a/code/classes.py b/code/classes.py index cef9483..e917ab0 100644 --- a/code/classes.py +++ b/code/classes.py @@ -90,6 +90,10 @@ 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) + + # 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.binData = "" @@ -128,7 +132,7 @@ class BMPHeader: print "INFORMATIONS COMP." print "=====================" print "rowsize: %s" % displayType( self.rowSize ) - print "rowEncoded: %s" % displayType( self.padding ) + print "padding: %s" % displayType( self.padding ) print "=====================" print @@ -163,7 +167,7 @@ class BMPContent: def __init__(self): self.map = [] self.binData = "" - self.readableData = "" + self.intData = [] # parse le content (bin) avec les informations: #
BMPHeader de l'image en question @@ -212,19 +216,37 @@ class BMPContent: # unparse une map de pixels en binaire - def unparse(self, map): + def unparse(self, map, headerHandler=None): self.map = map - 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 + if not isinstance(headerHandler, BMPHeader): + headerHandler = BMPHeader() + + headerHandler.signature = int( 0x4D42 ) + headerHandler.offset = 54 + 68 # taille header(54) + taille palette(68) + headerHandler.infoSize = headerHandler.offset - 14 # valeur d'offset - 14 + headerHandler.width = len( map[0] ) # récupérée à partir de l'argument + headerHandler.height = len( map ) # récupérée à partir de l'argument + headerHandler.plans = 1 + headerHandler.bpp = 24 + headerHandler.compType = 0 + headerHandler.horiRes = int( 0xB13 ) + headerHandler.vertRes = int( 0xB13 ) + headerHandler.colorNb = 0 + headerHandler.colorINb = 0 + + # valeurs calculées + headerHandler.padding = ( 4 - headerHandler.width*3 % 4 ) % 4 + headerHandler.size = headerHandler.width * headerHandler.height * headerHandler.bpp # taille de la map (hauteur*largeur* nombre d'octets par pixel) + headerHandler.rowSize = headerHandler.size / headerHandler.height # taille réelle de ligne + headerHandler.fileSize = headerHandler.offset + headerHandler.size # taille du fichier BMP = offset + taille map self.binData = "" for line in self.map[::-1]: for pixel in line: self.binData += chr(pixel.b) + chr(pixel.g) + chr(pixel.r) - for zero in range(0, padding): + for zero in range(0, headerHandler.padding): self.binData += chr(0) self.intData = [] @@ -248,6 +270,15 @@ class RGBPixel: #################################################### class BMPFile: + # CONSTRUCTEUR: instancie les attributs + def __init__(self): + self.header = BMPHeader() + self.content = BMPContent() + self.binData = "" + self.intData = [] + self.binPalette = "" + self.intPalette = [] + # parse à partir de en objets et def parse(self, binFile=""): # si on a défini le fichier @@ -288,7 +319,7 @@ class BMPFile: self.binPalette += chr(byte) # on déparse les classes utilisées - self.content.unparse( self.content.map ) + self.content.unparse( self.content.map, self.header ) self.header.unparse() # on enregistre le contenu brut binaire du fichier complet