unparse fini, il manque l'espace entre le HEADER et le CONTENT

This commit is contained in:
xdrm-brackets 2015-09-07 19:21:32 +02:00
parent 82107726e8
commit be81c0ae80
3 changed files with 74 additions and 12 deletions

View File

@ -25,6 +25,15 @@ img.parse( sys.argv[1] );
#print img.content.readableData #print img.content.readableData
print img.header.readableData
print "\n\n\n"
for byte in img.bin[:img.header.infoSize]:
print str(ord(byte)),
print "\n\n\n"
for line in img.content.map: for line in img.content.map:
for pixel in line: for pixel in line:

View File

@ -1,5 +1,6 @@
# ~*~ encoding: utf-8 ~*~ # # ~*~ encoding: utf-8 ~*~ #
import binascii
import sys import sys
################################################# #################################################
@ -28,18 +29,13 @@ class BMPHeader:
self.rowSize = 0; # longueur réelle d'une ligne self.rowSize = 0; # longueur réelle d'une ligne
self.padding = 0; # bourrage de fin de ligne (nb de bytes) self.padding = 0; # bourrage de fin de ligne (nb de bytes)
# convertit les octets <bytes> en entier
def toInt(self, bytes):
intReturn = 0;
for i, byte in enumerate(bytes):
intReturn += ord(byte) * (256 ** i)
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.bin = 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)
# 4 empty bytes (empty value = 0)
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)
self.infoSize = self.toInt(binHeader[14:18]) # taille du INFO_HEADER self.infoSize = self.toInt(binHeader[14:18]) # taille du INFO_HEADER
self.width = self.toInt(binHeader[18:22]) # longueur de l'image (pixel) self.width = self.toInt(binHeader[18:22]) # longueur de l'image (pixel)
@ -51,7 +47,7 @@ class BMPHeader:
self.horiRes = self.toInt(binHeader[38:42]) # résolution horizontale (pixels) self.horiRes = self.toInt(binHeader[38:42]) # résolution horizontale (pixels)
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 de couleurs importantes de l'images (ou 0)
# calculated values # calculated values
self.rowSize = self.size / self.height # taille réelle d'une ligne (+padding) self.rowSize = self.size / self.height # taille réelle d'une ligne (+padding)
@ -61,7 +57,40 @@ class BMPHeader:
self.readableData = "" self.readableData = ""
for byte in binHeader: for byte in binHeader:
self.readableData += str(ord(byte)) + " " self.readableData += str(ord(byte)) + " "
# fonction qui créer <self.bin> à partir des attributs
def unparse(self):
bytes = []
bytes += [ self.fromInt(self.signature, 2) ] # signature
bytes += [ self.fromInt(self.fileSize, 4) ] # taille fichier BMP
bytes += [ self.fromInt(0, 4) ] # 4 bytes inutilisés
bytes += [ self.fromInt(self.offset, 4) ] # début de l'image (bytes)
bytes += [ self.fromInt(self.infoSize, 4) ] # taille du INFO_HEADER
bytes += [ self.fromInt(self.width, 4) ] # longueur de l'image (pixels)
bytes += [ self.fromInt(self.height, 4) ] # hauteur de l'image (pixels)
bytes += [ self.fromInt(self.plans, 2) ] # nombre de plans (default: 1)
bytes += [ self.fromInt(self.bpp, 2) ] # nombre de bits par pixel (1,4,8, 24)
bytes += [ self.fromInt(self.compType, 4) ] # type de compression
bytes += [ self.fromInt(self.size, 4) ] # taille de la map (matrice de pixels)
bytes += [ self.fromInt(self.horiRes, 4) ] # résolution horizontale
bytes += [ self.fromInt(self.vertRes, 4) ] # résolution verticale
bytes += [ self.fromInt(self.colorNb, 4) ] # nombre de couleurs de l'image (ou 0)
bytes += [ self.fromInt(self.colorINb, 4) ] # nombre de couleurs importantes de l'image (ou 0)
# human-readable data
self.readableData = ""
self.bin = "";
for byte in bytes:
self.bin += byte
self.readableData += str(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
@ -87,7 +116,30 @@ class BMPHeader:
print "rowsize: %s" % ( hex(self.rowSize ) ) print "rowsize: %s" % ( hex(self.rowSize ) )
print "rowEncoded: %s" % ( hex(self.padding ) ) print "rowEncoded: %s" % ( hex(self.padding ) )
print "=====================" print "====================="
print print
# convertit les octets <bytes> en entier
def toInt(self, bytes):
intReturn = 0;
for i, byte in enumerate(bytes):
intReturn += ord(byte) * (256 ** i)
return intReturn
# écrit le valeur entière <intCode> en octet bourrés jusqu'à la taille <N>
def fromInt(self, intCode, N):
s = '0' + bin(intCode)[2:]
rtn = ""
while s != "":
rtn += chr( int(s[-8:], 2) )
s = s[:-8]
# on rajoute des zéros si besoin de padding
if N > len(rtn):
rtn = chr(int( "0" * ( N-len(rtn) ) )) + rtn
return rtn
#################################################### ####################################################
@ -156,9 +208,10 @@ class BMPContent:
self.bin = "" self.bin = ""
for line in self.map[::-1]: for line in self.map[::-1]:
for pixel in line: for pixel in line:
self.bin += unichr(pixel.b) + unichr(pixel.g) + unichr(pixel.r) self.bin += chr(pixel.b) + chr(pixel.g) + chr(pixel.r)
for zero in range(0, padding): for zero in range(0, padding):
self.bin += unichr(0) self.bin += chr(0)
################################# #################################
# classe contenant un pixel RGB # # classe contenant un pixel RGB #
@ -210,4 +263,4 @@ class BMPFile:
# unparse à partir d'un <BMPHeader> et d'un <BMPContent> # unparse à partir d'un <BMPHeader> et d'un <BMPContent>
def unparse(self): def unparse(self):
print "To Do !" print "To Do !"
print "implement unparse function" print "implement unparse function"

Binary file not shown.