在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);
}
}
这是我不确定的最后一行代码
答案 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链接中所述。