谁能解释一下 RowSize 和 PixelArraySize 在 BMP 文件格式中的含义?
Can anyone please explain what RowSize and PixelArraySize mean in BMP file format?
我正在写一个读取BMP图像文件的代码,我无法理解RowSize
和PixelArraySize
的意思或它们的操作,这两个公式用于填充行到4字节的倍数?谁能帮我理解这个?非常感谢!
图像是像素数组。
每个像素都有一个深度(通常 8 或 16 位),值越高,像素最亮。 => 这解释了等式中的 BitsPerPixel
。
为了可以存储和处理图像,它们应该 通常 的存储大小(不是像素大小)是 4 的倍数。=> 如果行是多行或 4,无论图像的高度,图像大小将是 4 的倍数。这就是您找到 RowSize
.
的原因
这对于 black/white 图像来说很“简单”,考虑到彩色图像 通常 每个像素有 3 个值(例如 RGB 格式有一个值红色,绿色一个,蓝色一个)=> 它们也应该保持为 4
的倍数
正如公式下方的图片中所解释的,RowSize
表示以 字节 为单位的单个图像行大小,四舍五入(padded) 到最接近的 4 的倍数。通常出于性能原因(内存对齐)应用此填充。
公式显示了2种计算方法 RowSize
, padded to 4 bytes:
ceil(BitsPerPixel * ImageWidth / 32) * 4
- 以位为单位取行大小,除以 32(即 4 个字节),四舍五入 up,然后乘以 4 得到字节数
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
倍。
我正在写一个读取BMP图像文件的代码,我无法理解RowSize
和PixelArraySize
的意思或它们的操作,这两个公式用于填充行到4字节的倍数?谁能帮我理解这个?非常感谢!
图像是像素数组。
每个像素都有一个深度(通常 8 或 16 位),值越高,像素最亮。 => 这解释了等式中的 BitsPerPixel
。
为了可以存储和处理图像,它们应该 通常 的存储大小(不是像素大小)是 4 的倍数。=> 如果行是多行或 4,无论图像的高度,图像大小将是 4 的倍数。这就是您找到 RowSize
.
这对于 black/white 图像来说很“简单”,考虑到彩色图像 通常 每个像素有 3 个值(例如 RGB 格式有一个值红色,绿色一个,蓝色一个)=> 它们也应该保持为 4
的倍数正如公式下方的图片中所解释的,RowSize
表示以 字节 为单位的单个图像行大小,四舍五入(padded) 到最接近的 4 的倍数。通常出于性能原因(内存对齐)应用此填充。
公式显示了2种计算方法 RowSize
, padded to 4 bytes:
ceil(BitsPerPixel * ImageWidth / 32) * 4
- 以位为单位取行大小,除以 32(即 4 个字节),四舍五入 up,然后乘以 4 得到字节数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
倍。