2016-07-05 128 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]实部设置的东西,并留下虚部作为它是。