步幅和填充图像

时间:2015-04-28 06:53:43

标签: image image-processing

我想使用CreateBitmapFromMemory方法,它需要步幅作为输入。而这个步伐使我困惑。

  

cbStride [in]

     

输入:UINT

     

pbBuffer中连续扫描线之间的字节数。

here它说:stride = image width + padding

  1. 为什么我们需要这些额外的空间(填充)。为什么不只是图像宽度。
  2. 这是计算步幅的权利吗?

        lWidthByte = (lWidth * bits + 7) / 8;
    

    lWidth→像素数

    位→每像素位数

    我认为8的偏差是转换为字节。但是,

    1. (+7)在这做什么?
    2. 最后

          cbStride =((lWidthByte + 3) / 4) * 4;
      
      1. 这是怎么回事? (为什么不cbStride = lWidthByte)
      2. 请帮我清除这些。

1 个答案:

答案 0 :(得分:6)

填充的使用是由于各种(旧的和当前的)内存布局优化 使图像像素行具有4/8/16字节的整数倍的长度(以字节为单位)可以显着简化和优化许多基于图像的操作。原因是这些尺寸允许在CPU寄存器中正确存储和并行像素处理,例如,使用SSE / MMX,不会混合连续两行的像素 如果没有填充,则必须插入额外的代码来处理部分WORD / DWORD像素数据,因为内存中的两个连续像素可能指向一行右侧的一个像素和下一行的左侧像素。

如果您的图像是具有8位深度的单通道图像,即[0,255]范围内的灰度图像,那么步幅将是向上舍入到最接近4或8字节的倍数的图像宽度。请注意,即使像素可能具有多个字节深度,步长也总是以字节为单位指定。

对于每个像素/通道具有更多通道和/或多个字节的图像,步幅将是图像宽度,以字节为单位四舍五入到最接近的4或8个字节的倍数。

你给出的+7和类似的算术例子只是确保数字被正确舍入,因为整数数学截断了除法的非整数分量。
只需插入一些数字,看看它是如何工作的。不要忘记截断(floor())中间分区结果。