diff --git a/code/BMPFile.py b/code/BMPFile.py index fdb337a..d1cbac1 100644 --- a/code/BMPFile.py +++ b/code/BMPFile.py @@ -65,9 +65,6 @@ class BMPHeader: self.intData = [] for byte in parsingData: self.intData.append( ord(byte) ) - - #self.info() - # fonction qui créer à partir des attributs @@ -101,7 +98,6 @@ class BMPHeader: for byte in self.intData: self.binData += chr( byte ) - # Retourne au format humain, toutes les infos du header def info(self, type=0): # 0 = int, 1 = hex @@ -219,8 +215,9 @@ class BMPContent: # exit() # taille avec un padding de 1 - correctSize = header.rowSize * header.height; - + correctSize = (header.width*header.bpp/8+header.padding) * header.height; + + # si le fichier a une mauvaise taille donc mauvais format if not len(binContent) == correctSize: print "Mauvais format (erreur de taille)" @@ -253,42 +250,42 @@ class BMPContent: # unparse une map de pixels en binaire - def unparse(self, map, palettes, headerHandler=None, newBpp=None): - self.map = map + def unparse(self, pixelMap, palettes, headerHandler=None): + + self.map = pixelMap if not isinstance(headerHandler, BMPHeader): headerHandler = BMPHeader() - bpp = self.map[0][0].bpp; + if headerHandler.bpp not in [1,4,8,24]: # définition du bpp si incohérent + headerHandler.bpp = pixelMap[0][0].bpp headerHandler.signature = int( 0x4D42 ) - headerHandler.offset = 54 + len(palettes[bpp]) # taille header(54) + taille palette(68) - headerHandler.infoSize = 40 # 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.offset = 54 + len(palettes[headerHandler.bpp]) # taille header(54) + taille palette(68) + headerHandler.infoSize = 40 # valeur d'offset - 14 + headerHandler.width = len( pixelMap[0] ) # récupérée à partir de l'argument + headerHandler.height = len( pixelMap ) # récupérée à partir de l'argument headerHandler.plans = 1 - # on récupère l'attribut BPP des RGBPixel - headerHandler.bpp = map[0][0].bpp + headerHandler.compType = 0 headerHandler.horiRes = 0 headerHandler.vertRes = 0 headerHandler.colorNb = 0 headerHandler.colorINb = 0 - if newBpp in [1,4,8,24]: # si nouveau bpp défini - headerHandler.bpp = newBpp; + # valeurs calculées - headerHandler.rowSize = headerHandler.width * headerHandler.bpp/8 - headerHandler.padding = 4 - headerHandler.rowSize%4 + headerHandler.rowSize = headerHandler.width * headerHandler.bpp/8 + headerHandler.padding = 4 - headerHandler.rowSize%4 if headerHandler.padding == 4: headerHandler.padding = 0; - headerHandler.rowSize += headerHandler.padding - headerHandler.size = headerHandler.rowSize * headerHandler.height # taille de la map (hauteur*largeur* nombre d'octets par pixel) - headerHandler.fileSize = headerHandler.offset + headerHandler.size # taille du fichier BMP = offset + taille map + headerHandler.rowSize += headerHandler.padding + headerHandler.size = headerHandler.rowSize * headerHandler.height # taille de la map (hauteur*largeur* nombre d'octets par pixel) + headerHandler.fileSize = headerHandler.offset + headerHandler.size # taille du fichier BMP = offset + taille map self.binData = "" - for line in map[::-1]: + for line in pixelMap[::-1]: for pixel in line: pixel.setRGB(pixel.r, pixel.g, pixel.b, bpp=headerHandler.bpp); self.binData += pixel.binData @@ -334,12 +331,12 @@ class RGBPixel: self.binData = chr(g) + chr(b) + chr(r) - def setRGB(self, r, g, b,x=-1, y=-1, bpp=24): - self.__init__(r, g, b, bpp); + def setRGB(self, r=0, g=0, b=0, x=-1, y=-1, bpp=24): + self.__init__(r=r, g=g, b=b, x=x, y=y, bpp=bpp); def setBin(self, binData, width, padding, index, bpp=24): if bpp not in [1,4,8,24]: - if not hasattr(self, 'bpp'): # si l'attribut n'est pas déjà défini, alors on met la valeur par défaut + if not( hasattr(self, 'bpp') and self.bpp in [1,4,8,24] ): # si l'attribut n'est pas déjà défini, alors on met la valeur par défaut self.bpp = 24 else: self.bpp = bpp @@ -454,16 +451,17 @@ class BMPFile: tmp = [[x,x,x,0] for x in range(0,256)] palette[8] = []; palette[8] += [x for l in tmp for x in l] - palette[24] = [66, 71, 82, 115] + [0]*48 + [2] + [0]*15 + palette[24] = [ord("B"), ord("G"), ord("R"), ord("s")] + [0]*48 + [2] + [0]*15 + - - bpp = None if newBpp in [1,4,8,24]: # si nouveau bpp défini - bpp = newBpp; - + self.header.bpp = newBpp; + else: + if self.header.bpp not in [1,4,8,24]: + self.header.bpp = 24 # on déparse les classes utilisées - self.content.unparse( self.content.map, palette, self.header, newBpp=bpp ) + self.content.unparse( self.content.map, palette, self.header) self.header.unparse() self.intPalette = palette[self.header.bpp] diff --git a/code/mask.bmp b/code/mask.bmp new file mode 100644 index 0000000..2b000e4 Binary files /dev/null and b/code/mask.bmp differ diff --git a/code/new.bmp b/code/new.bmp index e199a71..1d89c27 100644 Binary files a/code/new.bmp and b/code/new.bmp differ diff --git a/code/tests.py b/code/tests.py index 5c8d008..43c0ebe 100644 --- a/code/tests.py +++ b/code/tests.py @@ -135,30 +135,28 @@ def testFileIntegrity(): print "%s |" % (t.get()) - img = BMPFile(); # Instanciation du BMPFile - + A = BMPFile(); # Instanciation du BMPFile # Parsing print "| Parsing file |",; t.reset(); - img.parse( binFile ); + A.parse( binFile ); print "%s |" % (t.get()) - returnValue += img.header.info(); - - - - + returnValue += A.header.info(); # Unparsing print "| Unparsing file |",; t.reset(); - img.unparse(); + A.unparse(); print "%s |" % (t.get()) # Writing print "| Writing file |",; t.reset(); - img.write( sys.argv[2] ) + A.write( sys.argv[2] ) print "%s |" % (t.get()) + + B = BMPFile() + # lecture du fichier print "| Reading Image |",; t.reset(); with open( sys.argv[2] ) as file: @@ -167,10 +165,10 @@ def testFileIntegrity(): # Parsing print "| Parsing file |",; t.reset(); - img.parse( binFile ); + B.parse( binFile ); print "%s |" % (t.get()) - returnValue += "\n\n\n" + img.header.info(); + returnValue += "\n\n\n" + B.header.info(); return returnValue;