谁能解释一下 RowSize 和 PixelArraySize 在 BMP 文件格式中的含义?
Posted
技术标签:
【中文标题】谁能解释一下 RowSize 和 PixelArraySize 在 BMP 文件格式中的含义?【英文标题】:Can anyone please explain what RowSize and PixelArraySize mean in BMP file format? 【发布时间】:2021-02-27 13:09:19 【问题描述】:我正在编写用于读取 BMP 图像文件的代码,但我无法理解 RowSize
和 PixelArraySize
的含义或它们的操作,这两个公式是否用于将行填充为 4 字节的倍数?谁能帮我理解这一点?非常感谢!
【问题讨论】:
对不起,如果我犯了错误,但我正在编写用于读取 bmp 图像的 c++ 代码,并且遇到了上面提到的问题! @MarcoBonelli “我正在编写用于读取 BMP 图像文件的代码,...”:对我来说这听起来像是一个编程问题 @Alazar 我认为你的问题是完全正确的。编程不仅仅是代码,它也是关于定义和理解概念的。我说的是 35 年的经验。 等式中没有PixelArraySize
。
请使用文字(即使是公式)而不是图片。
【参考方案1】:
正如公式正下方的图片中所解释的,RowSize
表示单个图像行大小,以 字节 为单位,四舍五入(填充)到最接近的 4 倍数. 这种填充通常用于性能原因(内存对齐)。
公式显示了 2 种计算 RowSize
的方法,填充到 4 个字节:
ceil(BitsPerPixel * ImageWidth / 32) * 4
- 以位为单位取行大小,除以 32(即 4 个字节),向上舍入 ,然后乘以 4 得到字节数
floor((BitsPerPixel * ImageWidth + 31) / 32) * 4
- 以位为单位取行大小,加 31,除以 32(即 4 个字节),向下舍入 ,然后乘以 4 得到字节数
可以看出这两种方式是等价的。
通常首选版本 2,因为整数运算中的舍入是隐式发生的:
int BitsPerPixel, ImageWidth;
. . .
int RowSize = ((BitsPerPixel * ImageWidth + 31) / 32) * 4; // Voila.
现在,PixelArraySize
只是 RowSize
乘以行数。
【讨论】:
非常感谢我的朋友,这是我一直在寻找的,因为我将一个值代入变量中,然后我得到了一个小数点,这就是我的困惑所在。在此先感谢兄弟。【参考方案2】:图像是一个像素数组。
每个像素都有一个深度(通常 8 或 16 位),值越高,像素越亮。 => 这解释了方程式中的BitsPerPixel
。
为了能够存储和处理图像,它们通常应该具有 4 的倍数的存储大小(不是像素大小)。=> 如果行是多个或 4,无论图像,图像大小将是 4 的倍数。这就是您找到 RowSize
的原因。
这对于黑白图像来说“很简单”,考虑到彩色图像通常每个像素有 3 个值(例如,RGB 格式有一个红色值,另一个绿色值和一个对于蓝色)=> 它们也应该保持为 4 的倍数
【讨论】:
我说了这么多通常,因为有基于高达 64 位像素深度的图像格式。此外,还有像 RTMAPS 这样的程序能够处理大小为非 4 倍数的图像(这可能会使其变慢) 哇,谢谢你的解释,它有很大帮助!所以方程也做填充!以上是关于谁能解释一下 RowSize 和 PixelArraySize 在 BMP 文件格式中的含义?的主要内容,如果未能解决你的问题,请参考以下文章
我正在研究沙发底座,谁能解释一下bucket和vbucket到底是啥?