【问题标题】:Monochrome Bitmap (1 bbp) Padding and extra 0xF0 byte单色位图 (1 bbp) 填充和额外的 0xF0 字节
【发布时间】:2015-04-02 10:41:24
【问题描述】:

我正在使用单色位图图像,每像素 1 位。

当我使用十六进制编辑器检查文件时,我注意到每一行都以以下十六进制序列结尾:f0 00 00 00

稍微研究了一下这个问题,我得出结论,最后三个字节00 00 00对应行填充。

问题一:

我想知道以下算法在 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 px,则 n_nbPaddingBytes = 3。

问题 2:

除了填充 (00 00 00) 之外,我在每一行的三个字节填充之前都有这个 F0 字节。它会在图像右侧产生一条 4 像素的黑色垂直线。

注意 1:我在 Zebra 打印机上打印图像之前对其进行处理(我正在垂直翻转图像并恢复颜色:基本上黑色像素变成白色像素,反之亦然)。

注意2:当我用Paint打开原始BMP图像时,它的右侧没有这样的黑色垂直线。

这个字节 0xF0 出现在每一行的末尾有什么原因吗?

感谢您的帮助。 最好的问候。

【问题讨论】:

    标签: algorithm bitmap padding bmp monochrome


    【解决方案1】:

    代表位图像素的位被打包成行。每行的大小通过填充四舍五入为 4 字节的倍数(一个 32 位 DWORD)。

    RowSize = [(BitsPerPixel * ImageWidth + 31) / 32] * 4(除法为整数)

    (BMP file format)

    宽度 = 100 的单色图像的行大小为 16 字节(128 位),因此 3.5 字节用于填充(F0 和 00 00 00 的第二个半字节)。 F 代表右 4 列图像(通常 0/1 调色板为白色)。

    【讨论】:

    • 感谢您的回答。真的吗?填充的字节数可以是浮点数吗?所以我猜我提出的算法不正确,是吗?
    • 不,我计算有效填充字节 - 你的 100 个像素占用 100 位 = 12 1/2 字节,所以我写了大约 3.5
    • 每行的字节数可以这样计算:(((biWidth + 31) &amp; ~31) &gt;&gt; 3) 用于单色位图。改编自here(参见stride)。
    • @urbanSoft 给出相同的结果
    • @MBo 我没有另外声明。 :) 只是我偶然发现的另一个功能,因为目前我正在处理同一主题。
    猜你喜欢
    • 1970-01-01
    • 2013-11-20
    • 2017-09-23
    • 1970-01-01
    • 1970-01-01
    • 2018-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多