【问题标题】:Stride and buffersize when processing images处理图像时的步幅和缓冲区大小
【发布时间】:2013-11-19 04:55:33
【问题描述】:

在 MSDN 上,我找到了 this 用于定义图像步幅。简而言之,它是缓冲区中一行的字节宽度。

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

这只是步幅 - 3 * 图像宽度,因为我每个像素有 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);
        }
    }

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

【问题讨论】:

    标签: c# directshow


    【解决方案1】:

    步幅将被填充到 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 链接中所述,您之前的方法在自下而上的图像上也会失败。

    【讨论】:

    • 所以 W*3 + 3 ?并且它指出对于 2 个相同像素大小的图像可以有不同的步幅,所以不应该合并该变量吗?
    • 为什么是 W*3+3 ?我认为它们的意思是 2 个图像,每个像素具有不同的字节数。 AFAIK 步幅被填充到 4 字节边界,因此对于具有相似宽度和每像素字节数的图像,它应该是相同的。请记住,stride 也可能是负数,这表示图像是自下而上排列的。
    • 出于性能原因,我使用 Byte* 缓冲区,我需要遍历所有像素。所以我有 3 个 forloops(一个用于高度,一个用于宽度,一个用于 RGB):Pointer += m_stride - 3 * m_height 根据您的解释,我认为这是一种错误的方法,但我不太确定如何那么解决问题,如果图像可以倒置...
    • 对不起,一个修复。外环当然应该是高度,而不是宽度。
    猜你喜欢
    • 2011-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-10
    • 2020-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多