我打开一张16色(4 bit)的图片,图象的大小为32 * 64(像素为单位),计算下来,由于4 bit可以表示一个像素,
那图象大小是 32 * 64 /2 = 1024(BYTE)那么
dwDibSize = file.GetLength() - sizeof(BITMAPFILEHEADER);
int nBIH = sizeof(BITMAPINFOHEADER);
int nRGB = m_nColorCount * sizeof(RGBQUAD);
m_dwDibSize = dwDibSize - sizeof(BITMAPINFOHEADER) - m_nColorCount * sizeof(RGBQUAD);照理说m_dwDibSize应该是1024才对!,可为什么m_dwDibSize是1026呢??想不明白,百思不得其解!怎么会多出两个字节呢??

解决方案 »

  1.   

     file.GetLength()中的file是这个文件吗?
      

  2.   

    nColorCount是颜色数,是2,16,256,真彩色!
    file.GetLength是这个文件
      

  3.   

    正常情况下该文件大小应该是1142,有可能是其它原因导致文件最后多了2字节,看一下你这个文件的大小是不是1144,文件大一些也不会影响bitmap的使用。
      

  4.   

    是不是BMP文件包含了保留字节啊
      

  5.   

    BITMAPFILEHEADER中有一个bfOffBits.
    这个是图像数据的真正开始位置。也就是说
    BITMAPINFOHEADER和颜色表之后可能有其他信息。
    还有cnzdgs说的图像结束后文件不需要结束。图像数据的大小在BITMAPINFOHEADER中有(如果压缩)。
      

  6.   

    还有cnzdgs说的图像结束后文件不需要结束,
    什么意思?是不是m_dwDibSize是1026,但是图像数据是前1024字节,后两个字节是文件的信息?
    我主要是想图像的Raw Data是1026字节中,图像中的1024字节是前1024字节呀?
    为什么这里会是1026,应该是1024才是!真奇怪???
      

  7.   

    我的意思是说,这个BMP文件至少要有1142字节,后面可以有不属于图象的多余的数据,这样不会影响图象的使用。至于文件中多余的数据是从何而来,就不得而知了,只能说文件不正常。
      

  8.   

    bmp文件,不足3字节的要补充为3的整数倍,你可以去试下,如果你的图刚好是3的整数倍,就不会补了
      

  9.   

    还有奇怪的是:    BITMAPINFOHEADER 变量 m_pDib的biSizeImage的值也是1026!奇怪???想不明白!!
      

  10.   

    据说用photoshop编辑过后会多出两个字节,不知道是真的假的
      

  11.   

    还有奇怪的是:         BITMAPINFOHEADER   变量   m_pDib的biSizeImage的值也是1026! 奇怪???想不明白!!==============================================================不需要奇怪,因为定义没有规定图像的数据必须像素数据的有效值相同。
    仔细的看看MSDN中的描述,你需要做的就是按照定义的规则读取,这样你应该不会用到各种不是必须的信息。
    而其他的软件可能在这里加入私有的信息。