2013-11-18 2 views
2

В MSDN я нашел this для определения шага изображения. Короче говоря, это ширина в байтах одной строки в буфере.Stride и buffersize при обработке изображений

Теперь у меня есть изображение 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); 
     } 
    } 

Это последняя строка кода я не уверен

ответ

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; 

Если вы используете .Stride свойство BitmapData объекта, вы должны 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, которую вы опубликовали.

+0

поэтому W * 3 + 3? и он утверждает, что для двух изображений одного и того же размера пикселя могут иметь разные шаги, поэтому не следует включать эту переменную? – Don

+0

Почему W * 3 + 3? Я думаю, что они означают 2 изображения с разными байтами на пиксель. Шаг AFAIK дополняется границей 4 байта, поэтому он должен быть идентичным для изображений с одинаковой шириной и байтами на пиксель. Помните, что шаг также может быть отрицательным, что указывает на то, что изображение расположено снизу вверх. – Rotem

+0

по соображениям производительности, я использую буфер Byte *, и мне нужно пройти через все пиксели. Итак, у меня есть 3 forloops (один для высоты, один для ширины и один для RGB), где я это делаю: Pointer + = m_stride - 3 * m_height С вашим объяснением, я вижу, что это неправильный подход, но я не совсем уверен как решить проблему тогда, если изображение может быть upsidedown ... – Don

 Смежные вопросы

  • Нет связанных вопросов^_^