public float[] GetBlendData() { var maxBlend = (float)MaxBlend; var blend3 = new float[_resolution.Width * _resolution.Height * 3]; Helpers.ArrayFill(blend3, maxBlend); var blendXList = new List <int>(); var blendYList = new List <int>(); foreach (var i in BlendRegionIndexes) { blendXList.Add(BlendRegionControlPoints[i].X); blendYList.Add(BlendRegionControlPoints[i].Y); } var blendx = blendXList.ToArray(); var blendy = blendYList.ToArray(); var bmp = new Bitmap(_resolution.Width, _resolution.Height); var g = Graphics.FromImage(bmp); var points = new System.Drawing.Point[blendx.Length]; for (var i = 0; i < blendx.Length; i++) { points[i] = new System.Drawing.Point(blendx[i], blendy[i]); } g.FillPolygon(Brushes.Black, points, System.Drawing.Drawing2D.FillMode.Winding); var bmpData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadOnly, bmp.PixelFormat); var data = new byte[bmp.Height * bmpData.Stride]; Marshal.Copy(bmpData.Scan0, data, 0, data.Length); bmp.UnlockBits(bmpData); var f = bmpData.Stride / bmp.Width; double ox = -1; int w = -1; for (int y = 0; y < _resolution.Height; y++) { var yf = y * _resolution.Width * f; for (int x = 0; x < _resolution.Width; x++) { if (data[x * f + yf + 3] > 0) { if (w == -1) { w = CalcWidth(data, f, _resolution.Width, x, y); ox = x; } var value = maxBlend; if (w > 0) { var x2 = 1d / w * (x - ox); if (Index == 1) { x2 = 1d - x2; } value = (float)(BlendCurve.GetY(x2) * maxBlend); } blend3[(x + y * _resolution.Width) * 3 + 0] = value; blend3[(x + y * _resolution.Width) * 3 + 1] = value; blend3[(x + y * _resolution.Width) * 3 + 2] = value; } else { w = -1; } } } return(blend3.ToArray()); }