Correction du bpp-8 et structuration des données
This commit is contained in:
parent
7935bcd687
commit
10a8628945
|
@ -66,9 +66,6 @@ class BMPHeader:
|
||||||
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
|
||||||
def unparse(self):
|
def unparse(self):
|
||||||
|
@ -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,7 +215,8 @@ 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:
|
||||||
|
@ -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]
|
||||||
|
|
Binary file not shown.
After Width: | Height: | Size: 257 KiB |
BIN
code/new.bmp
BIN
code/new.bmp
Binary file not shown.
Before Width: | Height: | Size: 227 KiB After Width: | Height: | Size: 352 KiB |
|
@ -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;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue