谁能解释一下 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 图像文件的代码,但我无法理解 RowSizePixelArraySize 的含义或它们的操作,这两个公式是否用于将行填充为 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到底是啥?

GWT RPC 中同步和异步接口的作用是啥。谁能详细解释一下?

谁能解释一下Applets和AWT?

这道题能解释一下吗?

DAO是啥啊?谁能帮忙解释一下??

谁能解释一下StandardScaler?