处理图像时跨步和缓冲

时间:2013-11-18 17:27:56

标签: c# directshow

在MSDN上,我找到this来了解图像步幅的定义。简而言之,它是缓冲区中一行的宽度(以字节为单位)。

现在我在一个类似的缓冲区中有一个RGB图像,我已经得到了步幅和图像宽度(以像素为单位),我想知道已经添加了多少填充字节。

这是否只是步幅 - 3 * imagewidth,因为每个像素有3个字节(RGB)?

unsafe private void setPrevFrame(IntPtr pBuffer)
    {
        prevFrame = new byte[m_videoWidth, m_videoHeight, 3];
        Byte* b = (byte*) pBuffer;
        for (int i = 0; i < m_videoWidth; i++)
        {
            for (int j = 0; j < m_videoHeight; j++)
            {
                for (int k = 0; k < 3; k++)
                {
                    prevFrame[i,j,k] = *b;
                    b++;
                }
            }
            b += (m_stride - 3 * m_videoHeight);
        }
    }

这是我不确定的最后一行代码

1 个答案:

答案 0 :(得分:2)

Stride将填充到4字节边界:

因此,如果您的图像宽度为W且每像素为3个字节:

int strideWidth = ((W * 3) - 1) / 4 * 4 + 4; 
//or simply
int strideWidth = Math.Abs(bData.Stride);

//and so
int padding = strideWidth - W * 3;

如果您使用BitmapData对象的.Stride属性,则必须Abs该值,因为它可能是否定的。

在您修改问题之后:

您无需知道填充以迭代图像的所有字节:

unsafe private void setPrevFrame(IntPtr pBuffer)
{
    for (int j = 0; j < m_videoHeight; j++)
    {
        b = scan0 + j * stride; //the first byte of the first pixel of the row
        for (int i = 0; i < m_videoWidth; i++)
        {
           ...
        }
    }
}

您自己以前的方法也会在自下而上的图像上失败,如您发布的MSDN链接中所述。