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

Discussion in 'Python' started by Jimmie He, Apr 29, 2013.

  1. Jimmie He

    Jimmie He Guest

    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
    Jimmie He, Apr 29, 2013
    #1
    1. Advertising

  2. Jimmie He

    Peter Otten Guest

    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.
    Peter Otten, Apr 29, 2013
    #2
    1. Advertising

  3. Jimmie He

    MRAB Guest

    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.
    MRAB, Apr 29, 2013
    #3
  4. 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.
    88888 Dihedral, Apr 29, 2013
    #4
  5. Jimmie He

    Jimmie He Guest

    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.
    Jimmie He, Apr 30, 2013
    #5
  6. Jimmie He

    Jimmie He Guest

    Totally right!Thanks again!
    Jimmie He, May 4, 2013
    #6
    1. Advertising

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

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Allan Herriman

    Re: VHDL testbench: read BMP Files?

    Allan Herriman, Aug 21, 2003, in forum: VHDL
    Replies:
    1
    Views:
    5,180
    Allan Herriman
    Aug 21, 2003
  2. Martin Thompson

    Re: VHDL testbench: read BMP Files?

    Martin Thompson, Aug 21, 2003, in forum: VHDL
    Replies:
    0
    Views:
    971
    Martin Thompson
    Aug 21, 2003
  3. Harry Simpson

    32 dpp BMP to 24dpp BMP??

    Harry Simpson, Oct 30, 2003, in forum: ASP .Net
    Replies:
    0
    Views:
    344
    Harry Simpson
    Oct 30, 2003
  4. Richard
    Replies:
    3
    Views:
    4,110
    velocity4anil
    Sep 19, 2007
  5. Scott Shuster
    Replies:
    4
    Views:
    625
Loading...

Share This Page