谁能解释一下 RowSize 和 PixelArraySize 在 BMP 文件格式中的含义?

Can anyone please explain what RowSize and PixelArraySize mean in BMP file format?

我正在写一个读取BMP图像文件的代码,我无法理解RowSizePixelArraySize的意思或它们的操作,这两个公式用于填充行到4字节的倍数?谁能帮我理解这个?非常感谢!

图像是像素数组。 每个像素都有一个深度(通常 8 或 16 位),值越高,像素最亮。 => 这解释了等式中的 BitsPerPixel。 为了可以存储和处理图像,它们应该 通常 的存储大小(不是像素大小)是 4 的倍数。=> 如果行是多行或 4,无论图像的高度,图像大小将是 4 的倍数。这就是您找到 RowSize .

的原因

这对于 black/white 图像来说很“简单”,考虑到彩色图像 通常 每个像素有 3 个值(例如 RGB 格式有一个值红色,绿色一个,蓝色一个)=> 它们也应该保持为 4

的倍数

正如公式下方的图片中所解释的,RowSize 表示以 字节 为单位的单个图像行大小,四舍五入(padded) 到最接近的 4 的倍数。通常出于性能原因(内存对齐)应用此填充。

公式显示了2种计算方法 RowSize, padded to 4 bytes:

  1. ceil(BitsPerPixel * ImageWidth / 32) * 4 - 以位为单位取行大小,除以 32(即 4 个字节),四舍五入 up,然后乘以 4 得到字节数

  2. floor((BitsPerPixel * ImageWidth + 31) / 32) * 4 - 以位为单位获取行大小,加 31,除以 32(即 4 个字节),四舍五入 down,然后乘以4 获取字节数

可以看出这两种方式是等价的

版本 2 通常是首选,因为整数运算中的向下舍入是隐式发生的:

int BitsPerPixel, ImageWidth;
. . .
int RowSize = ((BitsPerPixel * ImageWidth + 31) / 32) * 4; // Voila.

现在,PixelArraySize 只是行数的 RowSize 倍。