Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Python > Can read in the BMP data correctly ,but the size is not right?

Reply
Thread Tools

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

 
 
Jimmie He
Guest
Posts: n/a
 
      04-29-2013
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
 
Reply With Quote
 
 
 
 
Peter Otten
Guest
Posts: n/a
 
      04-29-2013
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
> 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.

 
Reply With Quote
 
 
 
 
MRAB
Guest
Posts: n/a
 
      04-29-2013
On 29/04/2013 18:20, 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 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.
 
Reply With Quote
 
88888 Dihedral
Guest
Posts: n/a
 
      04-29-2013
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.
 
Reply With Quote
 
Jimmie He
Guest
Posts: n/a
 
      04-30-2013
On Tuesday, April 30, 2013 1:57:07 AM UTC+8, Peter Otten wrote:
> 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

>
> > 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.

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.
 
Reply With Quote
 
Jimmie He
Guest
Posts: n/a
 
      05-04-2013
Totally right!Thanks again!
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Re: Is there any way to get the raw image data from a Nikon Coolpix S8200 P&S camera? Tony Cooper Digital Photography 16 04-17-2013 07:49 PM
Windows 8 - so bad it's hastening the death of the PC? ~misfit~ NZ Computing 18 04-15-2013 04:15 AM
Re: Is there any way to get the raw image data from a Nikon Coolpix S8200 P&S camera? nospam Digital Photography 0 04-09-2013 07:42 PM
BMP to TIFF or TIFF to BMP- any loss? Jenna Topping Digital Photography 5 01-23-2005 01:18 AM
32 dpp BMP to 24dpp BMP?? Harry Simpson ASP .Net 0 10-30-2003 07:36 PM



Advertisments