单色位图 (1 bbp) 填充和额外的 0xF0 字节
Monochrome Bitmap (1 bbp) Padding and extra 0xF0 byte
我正在处理单色位图图像,每像素 1 位。
当我使用十六进制编辑器检查文件时,我注意到每一行都以以下十六进制序列结尾:f0 00 00 00
.
稍微研究了一下这个问题,我得出结论,最后三个字节00 00 00
对应于行填充。
问题 1:
我想知道以下算法在 1 bbp BMP 图像的情况下确定填充字节数是否正确:
if(((n_width % 32) == 0) || ((n_width % 32) > 24))
{
n_nbPaddingBytes = 0;
}
else if((n_width % 32) <= 8)
{
n_nbPaddingBytes = 3;
}
else if((n_width % 32) <= 16)
{
n_nbPaddingBytes = 2;
}
else
{
n_nbPaddingBytes = 1;
}
n_width
是 BMP 图像的宽度(以像素为单位)。
例如,如果 n_width = 100 像素,则 n_nbPaddingBytes = 3。
问题 2:
除了填充 (00 00 00),我在每一行的三个字节填充之前都有这个 F0
字节。它会在图像右侧产生一条 4 像素的黑色垂直线。
注意 1:我在 Zebra 打印机上打印之前对图像进行了处理(我垂直翻转图像并恢复颜色:基本上黑色像素变成白色像素,反之亦然)。
注2:我用Paint打开BMP原图时,右边没有这条黑色竖线
为什么这个字节 0xF0 出现在每一行的末尾有什么原因吗?
感谢您的帮助。
最好的问候。
表示位图像素的位被打包成行。每行的大小通过填充向上取整为 4 字节的倍数(一个 32 位 DWORD)。
RowSize = [(BitsPerPixel * ImageWidth + 31) / 32] * 4
(除以整数)
宽度为 100 的单色图像的行大小为 16 字节(128 位),因此 3.5 字节用于填充(F0 的第二个半字节和 00 00 00)。 F
代表右侧 4 列图像(对于通常的 0/1 调色板为白色)。
我正在处理单色位图图像,每像素 1 位。
当我使用十六进制编辑器检查文件时,我注意到每一行都以以下十六进制序列结尾:f0 00 00 00
.
稍微研究了一下这个问题,我得出结论,最后三个字节00 00 00
对应于行填充。
问题 1:
我想知道以下算法在 1 bbp BMP 图像的情况下确定填充字节数是否正确:
if(((n_width % 32) == 0) || ((n_width % 32) > 24))
{
n_nbPaddingBytes = 0;
}
else if((n_width % 32) <= 8)
{
n_nbPaddingBytes = 3;
}
else if((n_width % 32) <= 16)
{
n_nbPaddingBytes = 2;
}
else
{
n_nbPaddingBytes = 1;
}
n_width
是 BMP 图像的宽度(以像素为单位)。
例如,如果 n_width = 100 像素,则 n_nbPaddingBytes = 3。
问题 2:
除了填充 (00 00 00),我在每一行的三个字节填充之前都有这个 F0
字节。它会在图像右侧产生一条 4 像素的黑色垂直线。
注意 1:我在 Zebra 打印机上打印之前对图像进行了处理(我垂直翻转图像并恢复颜色:基本上黑色像素变成白色像素,反之亦然)。
注2:我用Paint打开BMP原图时,右边没有这条黑色竖线
为什么这个字节 0xF0 出现在每一行的末尾有什么原因吗?
感谢您的帮助。 最好的问候。
表示位图像素的位被打包成行。每行的大小通过填充向上取整为 4 字节的倍数(一个 32 位 DWORD)。
RowSize = [(BitsPerPixel * ImageWidth + 31) / 32] * 4
(除以整数)
宽度为 100 的单色图像的行大小为 16 字节(128 位),因此 3.5 字节用于填充(F0 的第二个半字节和 00 00 00)。 F
代表右侧 4 列图像(对于通常的 0/1 调色板为白色)。