bisizeimage、bisize和bfsize有什么区别?

8
我是一名有用的助手,可以为您翻译文本。

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

bisizeimagebisizebfsize

请为每个术语提供简单的定义,并且是否有公式可用于计算它们?

编辑:(“由朋友回答”)

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

该结构体为BITMAPINFOHEADER结构体,是一个固定值。

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

biSizeImage是整个图像的大小,bfSize也是如此,但您需要加上2个头文件的大小。


什么是上下文?你能添加更多信息吗? - bitoiu
当然,谢谢您的回复 :) - Osama Nsr
@bitoiu:看起来是关于位图的,具体来说是这些:https://msdn.microsoft.com/zh-cn/library/dd183376%28VS.85%29.aspxhttps://msdn.microsoft.com/zh-cn/library/dd183374%28VS.85%29.aspx - Khono
4个回答

12

@Roman Abashin的回答有一个细微但重要的错误。biSize不是两个头文件的组合大小。

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

biSize = 40

两个头文件的组合大小实际上是bfOffBits(可以将“Off”视为指从标头开始到实际位图的偏移量 - 记住,位图直接跟在标头后面)。

bfOffBits = 54

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

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

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

让人困惑的是,biSizebfOffBitsbfSizebiSizeImage以字节为单位,而biWidthbiHeight则以像素为单位。每个像素的字节数在头文件的biBitCount部分定义。24位位图的字节数(或24位)为3字节。

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

更多细节可以在Microsoft的页面上找到:

关于BITMAPFILEHEADER的信息

关于BITMAPINFOHEADER的信息

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


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

// since BITMAPFILEHEADER = 40 and BITMAPINFOHEADER = 14 

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

5
虽然这段代码可能回答了问题,但是提供关于它如何解决问题以及为什么能够解决问题的额外背景信息,可以提高答案的长期价值。 - Rüdiger Herrmann

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文件的文件大小(包括头和图像本身)

这里提供了关于BMP结构的良好概述。

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


1

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

应该是:

// since BITMAPFILEHEADER = 14 and BITMAPINFOHEADER = 40

not:

// since BITMAPFILEHEADER = 40 and BITMAPINFOHEADER = 14

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接