Structure refaite (parse hors des constructeurs)
This commit is contained in:
parent
37958cc77d
commit
5bffb65914
16
code/bmp.py
16
code/bmp.py
|
@ -8,11 +8,21 @@ from classes import *
|
||||||
|
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
img = BMPFile( sys.argv[1] )
|
img = BMPFile()
|
||||||
|
img.parse( sys.argv[1] );
|
||||||
|
|
||||||
print img.header.info()
|
### print header human-readable data ###
|
||||||
|
#print img.header.info()
|
||||||
|
|
||||||
|
### print file human-readable data ###
|
||||||
|
#print img.readableData
|
||||||
|
|
||||||
|
### print header human-readable data ###
|
||||||
|
#print img.header.readableData
|
||||||
|
|
||||||
|
### print content human-readable data ###
|
||||||
|
#print img.content.readableData
|
||||||
|
|
||||||
print img.readableData
|
|
||||||
|
|
||||||
for line in img.content.map:
|
for line in img.content.map:
|
||||||
for pixel in line:
|
for pixel in line:
|
||||||
|
|
|
@ -29,12 +29,12 @@ class BMPHeader:
|
||||||
def toInt(self, bytes):
|
def toInt(self, bytes):
|
||||||
intReturn = 0;
|
intReturn = 0;
|
||||||
for i, byte in enumerate(bytes):
|
for i, byte in enumerate(bytes):
|
||||||
intReturn += ord(byte) * (256 ** i)
|
intReturn += ord(byte) * (256 ** i)
|
||||||
return intReturn
|
return intReturn
|
||||||
|
|
||||||
# parse le header au format bin en objet
|
# parse le header au format bin en objet
|
||||||
def parse(self, binHeader):
|
def parse(self, binHeader):
|
||||||
self.header = binHeader # header brut (format initial: bin)
|
self.bin = binHeader # header brut (format initial: bin)
|
||||||
self.signature = self.toInt(binHeader[ 0: 2]) # signature (4D42)
|
self.signature = self.toInt(binHeader[ 0: 2]) # signature (4D42)
|
||||||
self.fileSize = self.toInt(binHeader[ 2: 6]) # taille du fichier bmp (bytes)
|
self.fileSize = self.toInt(binHeader[ 2: 6]) # taille du fichier bmp (bytes)
|
||||||
self.offset = self.toInt(binHeader[10:14]) # début de l'image (bytes)
|
self.offset = self.toInt(binHeader[10:14]) # début de l'image (bytes)
|
||||||
|
@ -49,10 +49,15 @@ class BMPHeader:
|
||||||
self.vertRes = self.toInt(binHeader[42:46]) # résolution verticale (pixels)
|
self.vertRes = self.toInt(binHeader[42:46]) # résolution verticale (pixels)
|
||||||
self.colorNb = self.toInt(binHeader[46:50]) # nombre de couleurs de l'image (ou 0)
|
self.colorNb = self.toInt(binHeader[46:50]) # nombre de couleurs de l'image (ou 0)
|
||||||
self.colorINb = self.toInt(binHeader[50:54]) # nombre d'images importantes (ou 0)
|
self.colorINb = self.toInt(binHeader[50:54]) # nombre d'images importantes (ou 0)
|
||||||
|
|
||||||
|
self.readableData = ""
|
||||||
|
for byte in binHeader:
|
||||||
|
self.readableData += str(ord(byte)) + " "
|
||||||
|
|
||||||
|
|
||||||
# Affiche au format humain, toutes les infos du header
|
# Affiche au format humain, toutes les infos du header
|
||||||
def info(self):
|
def info(self):
|
||||||
|
print
|
||||||
print "INFORMATION DU HEADER"
|
print "INFORMATION DU HEADER"
|
||||||
print "====================="
|
print "====================="
|
||||||
print "signature: %s" % ( hex(self.signature) )
|
print "signature: %s" % ( hex(self.signature) )
|
||||||
|
@ -77,13 +82,19 @@ class BMPHeader:
|
||||||
####################################################
|
####################################################
|
||||||
class BMPContent:
|
class BMPContent:
|
||||||
|
|
||||||
# CONSTRUCTEUR: parse le content (bin) <binContent> avec les informations:
|
# CONSTRUCTEUR: instancie les attribus
|
||||||
|
def __init__(self):
|
||||||
|
self.map = []
|
||||||
|
self.bin = ""
|
||||||
|
self.readableData = ""
|
||||||
|
|
||||||
|
# parse le content (bin) <binContent> avec les informations:
|
||||||
# <header> BMPHeader de l'image en question
|
# <header> BMPHeader de l'image en question
|
||||||
def __init__(self, binContent, header):
|
def parse(self, binContent, header):
|
||||||
# gestion du bpp
|
# gestion du bpp
|
||||||
if( header.bpp != 24 ):
|
if( header.bpp != 24 ):
|
||||||
print "ne prends pas en charge les versions autre que bmp24";
|
print "Ne prends pas en charge les versions autre que bmp24";
|
||||||
exit
|
exit()
|
||||||
|
|
||||||
# taille avec un padding de 1
|
# taille avec un padding de 1
|
||||||
correctSizes = [
|
correctSizes = [
|
||||||
|
@ -94,8 +105,8 @@ class BMPContent:
|
||||||
# si le fichier a une mauvaise taille donc mauvais format
|
# si le fichier a une mauvaise taille donc mauvais format
|
||||||
padding = 0
|
padding = 0
|
||||||
if not len(binContent) in correctSizes:
|
if not len(binContent) in correctSizes:
|
||||||
print "Mauvais format"
|
print "Mauvais format (erreur de taille)"
|
||||||
exit
|
exit()
|
||||||
elif len(binContent) == correctSizes[0]:
|
elif len(binContent) == correctSizes[0]:
|
||||||
padding = 1
|
padding = 1
|
||||||
else:
|
else:
|
||||||
|
@ -120,9 +131,14 @@ class BMPContent:
|
||||||
i += 3 # on passe à la suite
|
i += 3 # on passe à la suite
|
||||||
|
|
||||||
i += padding # on saute le padding de saut de ligne
|
i += padding # on saute le padding de saut de ligne
|
||||||
|
|
||||||
self.map = self.map[::-1] # on inverse les lignes
|
self.map = self.map[::-1] # on inverse les lignes
|
||||||
|
|
||||||
|
self.bin = binContent
|
||||||
|
|
||||||
|
for byte in binContent:
|
||||||
|
self.readableData += str(ord(byte)) + " "
|
||||||
|
|
||||||
|
|
||||||
#################################
|
#################################
|
||||||
# classe contenant un pixel RGB #
|
# classe contenant un pixel RGB #
|
||||||
|
@ -139,24 +155,39 @@ class RGBPixel:
|
||||||
# classe qui parse un fichier BMP complet en objet #
|
# classe qui parse un fichier BMP complet en objet #
|
||||||
####################################################
|
####################################################
|
||||||
class BMPFile:
|
class BMPFile:
|
||||||
# CONSTRUCTEUR #
|
|
||||||
# à partir du fichier <filename>
|
# parse à partir du nom du fichier en > objets <BMPHeader> et <BMPContent>
|
||||||
# parse le header dans une classe <BMPHeader>
|
def parse(self, filename):
|
||||||
# parse le contenu dans une classe <BMPContent>
|
# si on a défini le fichier
|
||||||
def __init__(self, filename):
|
if filename == "":
|
||||||
|
print "Missing argument 1: filename.bmp"
|
||||||
|
exit()
|
||||||
|
|
||||||
# gestion du format
|
# gestion du format
|
||||||
if not ".bmp" in filename[-4:]:
|
if not ".bmp" in filename[-4:]:
|
||||||
print "must be a .bmp file"
|
print "must be a .bmp file"
|
||||||
exit
|
exit()
|
||||||
|
|
||||||
self.fileData = ""
|
self.bin = ""
|
||||||
self.readableData = ""
|
self.readableData = ""
|
||||||
with open(sys.argv[1]) as file:
|
|
||||||
|
# lecture du fichier
|
||||||
|
with open( filename ) as file:
|
||||||
for byte in file.read():
|
for byte in file.read():
|
||||||
self.fileData += byte;
|
self.bin += byte;
|
||||||
self.readableData += str(hex(ord(byte))) + " "
|
self.readableData += str(hex(ord(byte))) + " "
|
||||||
|
|
||||||
headerSize = 54
|
headerSize = 54
|
||||||
|
|
||||||
|
# parsing header
|
||||||
self.header = BMPHeader()
|
self.header = BMPHeader()
|
||||||
self.header.parse( self.fileData[:headerSize] )
|
self.header.parse( self.bin[:headerSize] )
|
||||||
self.content = BMPContent( self.fileData[self.header.offset:], self.header )
|
|
||||||
|
# parsing content
|
||||||
|
self.content = BMPContent()
|
||||||
|
self.content.parse( self.bin[self.header.offset:], self.header )
|
||||||
|
|
||||||
|
# unparse à partir d'un <BMPHeader> et d'un <BMPContent>
|
||||||
|
def unparse(self):
|
||||||
|
print "To Do !"
|
||||||
|
print "implement unparse function"
|
BIN
code/classes.pyc
BIN
code/classes.pyc
Binary file not shown.
Loading…
Reference in New Issue