Correction du bpp-8 et structuration des données

This commit is contained in:
xdrm-brackets 2015-09-20 16:36:02 +02:00
parent 7935bcd687
commit 10a8628945
4 changed files with 40 additions and 44 deletions

View File

@ -65,9 +65,6 @@ class BMPHeader:
self.intData = [] self.intData = []
for byte in parsingData: for byte in parsingData:
self.intData.append( ord(byte) ) self.intData.append( ord(byte) )
#self.info()
# fonction qui créer <self.binData> à partir des attributs # fonction qui créer <self.binData> à partir des attributs
@ -101,7 +98,6 @@ class BMPHeader:
for byte in self.intData: for byte in self.intData:
self.binData += chr( byte ) self.binData += chr( byte )
# Retourne au format humain, toutes les infos du header # Retourne au format humain, toutes les infos du header
def info(self, type=0): # 0 = int, 1 = hex def info(self, type=0): # 0 = int, 1 = hex
@ -219,8 +215,9 @@ class BMPContent:
# exit() # exit()
# taille avec un padding de 1 # 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 # si le fichier a une mauvaise taille donc mauvais format
if not len(binContent) == correctSize: if not len(binContent) == correctSize:
print "Mauvais format (erreur de taille)" print "Mauvais format (erreur de taille)"
@ -253,42 +250,42 @@ class BMPContent:
# unparse une map de pixels en binaire # unparse une map de pixels en binaire
def unparse(self, map, palettes, headerHandler=None, newBpp=None): def unparse(self, pixelMap, palettes, headerHandler=None):
self.map = map
self.map = pixelMap
if not isinstance(headerHandler, BMPHeader): if not isinstance(headerHandler, BMPHeader):
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.signature = int( 0x4D42 )
headerHandler.offset = 54 + len(palettes[bpp]) # taille header(54) + taille palette(68) headerHandler.offset = 54 + len(palettes[headerHandler.bpp]) # taille header(54) + taille palette(68)
headerHandler.infoSize = 40 # valeur d'offset - 14 headerHandler.infoSize = 40 # valeur d'offset - 14
headerHandler.width = len( map[0] ) # récupérée à partir de l'argument <map> headerHandler.width = len( pixelMap[0] ) # récupérée à partir de l'argument <map>
headerHandler.height = len( map ) # récupérée à partir de l'argument <map> headerHandler.height = len( pixelMap ) # récupérée à partir de l'argument <map>
headerHandler.plans = 1 headerHandler.plans = 1
# on récupère l'attribut BPP des RGBPixel
headerHandler.bpp = map[0][0].bpp
headerHandler.compType = 0 headerHandler.compType = 0
headerHandler.horiRes = 0 headerHandler.horiRes = 0
headerHandler.vertRes = 0 headerHandler.vertRes = 0
headerHandler.colorNb = 0 headerHandler.colorNb = 0
headerHandler.colorINb = 0 headerHandler.colorINb = 0
if newBpp in [1,4,8,24]: # si nouveau bpp défini
headerHandler.bpp = newBpp;
# valeurs calculées # valeurs calculées
headerHandler.rowSize = headerHandler.width * headerHandler.bpp/8 headerHandler.rowSize = headerHandler.width * headerHandler.bpp/8
headerHandler.padding = 4 - headerHandler.rowSize%4 headerHandler.padding = 4 - headerHandler.rowSize%4
if headerHandler.padding == 4: if headerHandler.padding == 4:
headerHandler.padding = 0; headerHandler.padding = 0;
headerHandler.rowSize += headerHandler.padding headerHandler.rowSize += headerHandler.padding
headerHandler.size = headerHandler.rowSize * headerHandler.height # taille de la map (hauteur*largeur* nombre d'octets par pixel) 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.fileSize = headerHandler.offset + headerHandler.size # taille du fichier BMP = offset + taille map
self.binData = "" self.binData = ""
for line in map[::-1]: for line in pixelMap[::-1]:
for pixel in line: for pixel in line:
pixel.setRGB(pixel.r, pixel.g, pixel.b, bpp=headerHandler.bpp); pixel.setRGB(pixel.r, pixel.g, pixel.b, bpp=headerHandler.bpp);
self.binData += pixel.binData self.binData += pixel.binData
@ -334,12 +331,12 @@ class RGBPixel:
self.binData = chr(g) + chr(b) + chr(r) self.binData = chr(g) + chr(b) + chr(r)
def setRGB(self, r, g, b,x=-1, y=-1, bpp=24): def setRGB(self, r=0, g=0, b=0, x=-1, y=-1, bpp=24):
self.__init__(r, g, b, bpp); self.__init__(r=r, g=g, b=b, x=x, y=y, bpp=bpp);
def setBin(self, binData, width, padding, index, bpp=24): def setBin(self, binData, width, padding, index, bpp=24):
if bpp not in [1,4,8,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 self.bpp = 24
else: else:
self.bpp = bpp self.bpp = bpp
@ -454,16 +451,17 @@ class BMPFile:
tmp = [[x,x,x,0] for x in range(0,256)] 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[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 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 # 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.header.unparse()
self.intPalette = palette[self.header.bpp] self.intPalette = palette[self.header.bpp]

BIN
code/mask.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 257 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 227 KiB

After

Width:  |  Height:  |  Size: 352 KiB

View File

@ -135,30 +135,28 @@ def testFileIntegrity():
print "%s |" % (t.get()) print "%s |" % (t.get())
img = BMPFile(); # Instanciation du BMPFile A = BMPFile(); # Instanciation du BMPFile
# Parsing # Parsing
print "| Parsing file |",; t.reset(); print "| Parsing file |",; t.reset();
img.parse( binFile ); A.parse( binFile );
print "%s |" % (t.get()) print "%s |" % (t.get())
returnValue += img.header.info(); returnValue += A.header.info();
# Unparsing # Unparsing
print "| Unparsing file |",; t.reset(); print "| Unparsing file |",; t.reset();
img.unparse(); A.unparse();
print "%s |" % (t.get()) print "%s |" % (t.get())
# Writing # Writing
print "| Writing file |",; t.reset(); print "| Writing file |",; t.reset();
img.write( sys.argv[2] ) A.write( sys.argv[2] )
print "%s |" % (t.get()) print "%s |" % (t.get())
B = BMPFile()
# lecture du fichier # lecture du fichier
print "| Reading Image |",; t.reset(); print "| Reading Image |",; t.reset();
with open( sys.argv[2] ) as file: with open( sys.argv[2] ) as file:
@ -167,10 +165,10 @@ def testFileIntegrity():
# Parsing # Parsing
print "| Parsing file |",; t.reset(); print "| Parsing file |",; t.reset();
img.parse( binFile ); B.parse( binFile );
print "%s |" % (t.get()) print "%s |" % (t.get())
returnValue += "\n\n\n" + img.header.info(); returnValue += "\n\n\n" + B.header.info();
return returnValue; return returnValue;