2016-07-05 5 views
-4
private static Complex[,] FromBitmapData(BitmapData _BitmapData) 
     { 
      if (_BitmapData.PixelFormat != PixelFormat.Format8bppIndexed) 
      { 
       throw new Exception("Source can be grayscale (8bpp indexed) only."); 
      } 

      int width = _BitmapData.Width; 
      int height = _BitmapData.Height; 
      int offset = _BitmapData.Stride - width; 

      if ((!Utils.IsPowerOf2(width)) || (!Utils.IsPowerOf2(height))) 
      { 
       throw new Exception("Image width and height should be power of 2."); 
      } 

      Complex[,] data = new Complex[width, height]; 

      unsafe 
      { 
       byte* src = (byte*)_BitmapData.Scan0.ToPointer(); 

       for (int y = 0; y < height; y++) 
       { 
        for (int x = 0; x < width; x++, src++) 
        { 
         data[y, x] = new Complex((float)*src/255, 
                data[y, x].Imaginary); 
        } 

        src += offset; 
       } 
      } 

      return data; 
     } 

Почему значение указано *src делится на 255?небезопасный код информация

ответ

0

Что такое Stride?

Для целей, таких как выравнивание и т. Д., Иногда ряд пикселей в растровой картинке длиннее ширины - и ее длина называется шагом. Таким образом, вы могли бы иметь ширину = 3 и шаг = 4, и строка данных будет выглядеть следующим образом:

Row: [Pixel][Pixel][Pixel][Unused] 

Что offset представляет?

Это разница между шагом и шириной, то есть когда вы прочитали все реальные пиксели в строке, сколько неиспользуемых вам нужно пропустить, чтобы перейти к следующей строке.

Почему src увеличивается на 1 во внутреннем цикле и снова увеличивается на offset во внешнем цикле?

Внутренний цикл считывает пиксели строки, поэтому src увеличивается на 1, чтобы перейти к следующему пикселю на каждой итерации. Но после того, как вы прочтете их все, вам нужно пропустить offset неиспользуемых данных, чтобы перейти к следующей строке.

Почему значение, на которое указывает *src, делится на 255?

Сложный тип имеет компоненты с плавающей запятой, а пиксели в растровых изображениях 8bpp представлены байтами, поэтому они имеют значения от 0–255. Разделение на 255 преобразует их в номера с плавающей запятой в диапазоне 0.0–1.0.

Почему data[x,y].Imaginary прошел как параметр?

По какой-то причине, эта функция хранит растровые данные в сложном типе, и сложный тип имеет реальные и мнимые компоненты, поэтому назначение

data[y, x] = new Complex(something, data[y,x].Imaginary); 

означает: установить реальный компонент data[y,x] к чему-то и оставить мнимую составляющую, как это.

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

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