不安全的代码说明
问题描述:
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?不安全的代码说明
答
什么是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]
实部设置的东西,并留下虚部作为它是。