Correction du bpp-8 et structuration des données
This commit is contained in:
parent
7935bcd687
commit
10a8628945
|
@ -65,9 +65,6 @@ class BMPHeader:
|
|||
self.intData = []
|
||||
for byte in parsingData:
|
||||
self.intData.append( ord(byte) )
|
||||
|
||||
#self.info()
|
||||
|
||||
|
||||
|
||||
# fonction qui créer <self.binData> à 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 <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]
|
||||
|
|
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())
|
||||
|
||||
|
||||
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;
|
||||
|
||||
|
|
Loading…
Reference in New Issue