Can read in the BMP data correctly ,but the size is not right?

J

Jimmie He

I'm trying to read in the BMP data by the the code below,and I'm check the data array with WINHEX,and it is correct,but which confuse me is why thesize is 0x180,but the actual picture should be 48*48 = 0x120 bytes because I use 1-bit BMP not the 24bit BMP,could any one give some hints?


--------------------------------------------------------------------------------
__Head_Info = [
[ 'Type' ,0 , 2],#BM
[ 'FSize' ,2 , 4],#File Size
[ 'Reserved' ,6 , 4],#0x00000000
[ 'OffBits' ,10 , 4],#Offset of Image
[ 'SSize' ,14 , 4],# 40
[ 'Width' ,18 , 4],#Width
[ 'Height' ,22 , 4],#Hight
[ 'Planes' ,26 , 2],#1
[ 'BitCount' ,28 , 2],#{1,2,4,8,24}
[ 'Compress' ,30 , 4],#0
[ 'SizeImage' ,34 , 4],#Bytes Per Line
[ 'XPM' ,38 , 4],#2835
[ 'YPM' ,42 , 4],#2835
[ 'ClrUsed' ,46 , 4],#0
[ 'ClrImportant' ,50 , 4]#0
]
_Type =0;
_FSize =1;
_Reserved =2;
_OffBits =3;
_SSize =4;
_Width =5;
_Height =6;
_Planes =7;
_BitCount =8;
_Compress =9;
_SizeImage =10;
_XPM =11;
_YPM =12;
_ClrUsed =13;
_ClrImportant =14;

def __getInt( b, idx):
return binToInt(b,__Head_Info[idx][1],__Head_Info[idx][2])

def saveMatrixtoASC(bmpfilename,ascfilename):
try:
handle1=open( bmpfilename ,"rb")
raw = bytearray(handle1.read( ))
handle1.close
except Exception as E:
return "error:"+ str(E),""

datastart=__getInt(raw, _OffBits)
datasize =__getInt(raw, _SizeImage)
print ('Image Offset = 0x%X'%datastart)
print ('Image Size = 0x%X'%datasize)
handle2=open( ascfilename ,"w")
for i in range(0,datasize):
handle2.write('0x%02X,'%raw[datastart+i])
if (i+1) % 16 == 0 :
handle2.write("\n")
handle2.close
 
P

Peter Otten

Jimmie said:
I'm trying to read in the BMP data by the the code below,and I'm check
the data array with WINHEX,and it is correct,but which confuse me is
why the size is 0x180,but the actual picture should be 48*48 = 0x120
bytes because I use 1-bit BMP not the 24bit BMP,could any one give some
hints?

According to wikipedia <http://en.wikipedia.org/wiki/BMP_file_format>

"""
The size of each row is rounded up to a multiple of 4 bytes [...]
"""

So 48/8 == 6 will be rounded to 8, and 8*48 == 384 == 0x180.
handle1=open( bmpfilename ,"rb")
raw = bytearray(handle1.read( ))
handle1.close

To actually do something the last line should be handle1.close(). I
recommend

with open(bmpfilename ,"rb") as handle1:
raw = bytearray(handle1.read())

instead which has the additional advantage that the file will be closed if
an exception occurs in the with-suite.
 
M

MRAB

I'm trying to read in the BMP data by the the code below,and I'm
check the data array with WINHEX,and it is correct,but which confuse
me is why the size is 0x180,but the actual picture should be 48*48 =
0x120 bytes because I use 1-bit BMP not the 24bit BMP,could any one
give some hints?
[snip]
What size is 0x180?

If you're asking why the file size is 0x180 and not 0x120, it's simply
because of the header. An image file contains not just the pixels of
the image, but also information about the image.
 
8

88888 Dihedral

Jimmie Heæ–¼ 2013å¹´4月30日星期二UTC+8上åˆ1時20分49秒寫é“:
I'm trying to read in the BMP data by the the code below,and I'm check the data array with WINHEX,and it is correct,but which confuse me is why the size is 0x180,but the actual picture should be 48*48 = 0x120 bytes because I use 1-bit BMP not the 24bit BMP,could any one give some hints?





--------------------------------------------------------------------------------

__Head_Info = [

[ 'Type' ,0 , 2],#BM

[ 'FSize' ,2 , 4],#File Size

[ 'Reserved' ,6 , 4],#0x00000000

[ 'OffBits' ,10 , 4],#Offset of Image

[ 'SSize' ,14 , 4],# 40

[ 'Width' ,18 , 4],#Width

[ 'Height' ,22 , 4],#Hight

[ 'Planes' ,26 , 2],#1

[ 'BitCount' ,28 , 2],#{1,2,4,8,24}

[ 'Compress' ,30 , 4],#0

[ 'SizeImage' ,34 , 4],#Bytes Per Line

[ 'XPM' ,38 , 4],#2835

[ 'YPM' ,42 , 4],#2835

[ 'ClrUsed' ,46 , 4],#0

[ 'ClrImportant' ,50 , 4]#0

]

_Type =0;

_FSize =1;

_Reserved =2;

_OffBits =3;

_SSize =4;

_Width =5;

_Height =6;

_Planes =7;

_BitCount =8;

_Compress =9;

_SizeImage =10;

_XPM =11;

_YPM =12;

_ClrUsed =13;

_ClrImportant =14;



def __getInt( b, idx):

return binToInt(b,__Head_Info[idx][1],__Head_Info[idx][2])



def saveMatrixtoASC(bmpfilename,ascfilename):

try:

handle1=open( bmpfilename ,"rb")

raw = bytearray(handle1.read( ))

handle1.close

except Exception as E:

return "error:"+ str(E),""



datastart=__getInt(raw, _OffBits)

datasize =__getInt(raw, _SizeImage)

print ('Image Offset = 0x%X'%datastart)

print ('Image Size = 0x%X'%datasize)

handle2=open( ascfilename ,"w")

for i in range(0,datasize):

handle2.write('0x%02X,'%raw[datastart+i])

if (i+1) % 16 == 0 :

handle2.write("\n")

handle2.close

The start of each line of bytes must be in the 32 bit=4byte
boundary in the MS BMP format.

Please read the MS specs.
 
J

Jimmie He

Jimmie He wrote:


I'm trying to read in the BMP data by the the code below,and I'm check
the data array with WINHEX,and it is correct,but which confuse me is
why the size is 0x180,but the actual picture should be 48*48 = 0x120
bytes because I use 1-bit BMP not the 24bit BMP,could any one give some



According to wikipedia <http://en.wikipedia.org/wiki/BMP_file_format>



"""

The size of each row is rounded up to a multiple of 4 bytes [...]

"""



So 48/8 == 6 will be rounded to 8, and 8*48 == 384 == 0x180.


handle1=open( bmpfilename ,"rb")
raw = bytearray(handle1.read( ))
handle1.close



To actually do something the last line should be handle1.close(). I

recommend



with open(bmpfilename ,"rb") as handle1:

raw = bytearray(handle1.read())



instead which has the additional advantage that the file will be closed if

an exception occurs in the with-suite.
I've successfully read the correct data from BMP now by your advice,thanks again Peter and other helpful guy.Especially the BMP_file_format from wiki,very Visualize.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,013
Latest member
KatriceSwa

Latest Threads

Top