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

@ -66,9 +66,6 @@ class BMPHeader:
for byte in parsingData:
self.intData.append( ord(byte) )
#self.info()
# fonction qui créer <self.binData> à partir des attributs
def unparse(self):
@ -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,7 +215,8 @@ 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:
@ -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 <map>
headerHandler.height = len( map ) # récupérée à partir de l'argument <map>
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 <map>
headerHandler.height = len( pixelMap ) # récupérée à partir de l'argument <map>
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]

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())
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;