bisizeimage,bisize和bfsize之间有什么区别?

时间:2014-09-07 17:49:52

标签: bitmap

我是这个领域的新手,我对某些术语感到困惑!

bisizeimage bisize bfsize

请为每个人定义一个简单的定义,是否有计算它们的公式?

编辑:("由朋友回答")

  

biSize>结构所需的字节数。   (究竟是什么结构?)

     
    

结构是struct BITMAPINFOHEADER。这是一个固定值。

  
     

biSizeImage>图像的大小(以字节为单位)。   bfSize>位图文件的大小(以字节为单位)。   (图像和位图文件有什么区别?)

     
    

biSizeImage是整个图像大小,bfSize是相同的,但你必须添加2个头文件的大小。

  

4 个答案:

答案 0 :(得分:8)

{{1}}

答案 1 :(得分:5)

@Roman Abashin的回答有一个轻微但重要的错误。 biSize不是两个标头的总和。

biSize是仅BITMAPINFOHEADER的大小。它是40个字节。

bfOffBits = 54

两个标头的总大小实际上是 bfOffBits (您可以将“ Off”看作是指实际位图与标头开头之间的偏移量-记住,位图是直的在标题之后)。

bfSize = biSizeImage + sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)
bfSize = biSizeImage + sizeof(BITMAPFILEHEADER) + biSize
bfSize = biSizeImage + 14                       + 40
bfSize = biSizeImage + 54
bfSize = biSizeImage + bfOffbits

因此,以下所有都是 bfSize 的正确公式:

{{1}}

@Roman Abashin的 biSizeImage 公式(实际位图的大小)对于24位位图是正确的。

令人困惑的是,biSize,bfOffBits,bfSize和biSizeImage都以字节为单位,而 biWidth和biHeight以像素为单位。每个像素的字节数在标题的biBitCount部分中定义。对于24位位图,它是3个字节(或24位)。

请注意,bfOffBits的单位以字节为单位,biBitCount的单位以位为单位。

可以在Microsoft的页面上找到更多详细信息:

Info on BITMAPFILEHEADER

Info on BITMAPINFOHEADER

编辑:我在下面的位图概述中添加了一些注释,以进一步阐明问题![layout of bitmap and headers with size information 编辑:将biSizeImage + 24(等)更改为+ 14。

答案 2 :(得分:1)

@ Shock451答案中的一个小错字。 根据:https://en.wikipedia.org/wiki/BMP_file_format,交换了BITMAPFILEHEADER和BITMAPINFOHEADER的值。

应该有:

// since BITMAPFILEHEADER = 14 and BITMAPINFOHEADER = 40

// since BITMAPFILEHEADER = 40 and BITMAPINFOHEADER = 14

答案 3 :(得分:1)

bfSize 是位图图像的完整文件大小,位图图像的文件大小由两部分组成:

  • 标题部分(包含有关文件的一般信息= bfOffBits
  • 图像部分(存储像素信息= biSizeImage

因此,我们有以下结构

bfSize = bfOffBits + biSizeImage 

此外, bfOffBits 标题部分)可以进一步细分为

  • 文件标题
  • 信息标题 biSize

因此,它也可以写成

bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + biSizeImage

由于(按今天的BMP定义), BITMAPFILEHEADER 的大小恰好是14个字节, BITMAPINFOHEADER 的大小恰好是40个字节,因此也可以写为

bfSize = 14 + 40 + biSizeImage

bfSize = 54 + biSizeImage

然而,这将是不好的做法,因为硬编码的“魔术数字”通常不受欢迎。

但是让我们看看 biSizeImage 。一般来说,图像本身的文件大小由颜色深度 * 宽度 * 高度组成。 24位BMP中的颜色深度为每像素3个字节(蓝色,绿色,红色分别为0-255个值) - 所谓的RGB三元组。专家的其他信息:三种颜色的值按蓝色,绿色,红色的顺序保存 - 搜索关键字LittleEndianness以获取有关该主题的更多信息。如果图像的宽度不能被4个字节分割,则BMP标准还将0添加为填充。

正如其他人指出的那样,有点令人困惑的是,你现在必须将大小的像素深度(以字节为单位)相乘。因此,我们有

biSizeImage = (biWidth * sizeof(RGBTRIPLE) + padding) * abs(biHeight) 

将为您提供图像的最终字节大小。

所以,总结一下:

  • biSizeImage = BMP的图像部分的文件大小(以字节为单位)
  • biSize = BMP标头信息标题部分的文件大小(以字节为单位)
  • bfsize =完整BMP的文件大小(以字节为单位)(包括标题和图片本身)

A nice overview of the structure of a BMP can be found here

编辑:添加了更正(感谢@MotherBrain)