/// <summary> /// 去除图片的多余边界 /// </summary> /// <param name="index"></param> private void RemoveRedundance(int index, double left, double top) { System.Drawing.Bitmap bitmapSource = ConvertClass.BitmapImageToBitMap((BitmapImage)keyFrames[index].Image.Source); System.Drawing.Bitmap bitmapTarget = new System.Drawing.Bitmap(bitmapSource.Width, bitmapSource.Height); StylusPointCollection points = trackStroke.StylusPoints; double pointWidth = keyFrames[index].Image.Width / bitmapSource.Width; unsafe { if (index == 0) { for (int i = 0; i < bitmapSource.Width; i++) { for (int j = 0; j < bitmapSource.Height; j++) { System.Drawing.Color pixelColor = bitmapSource.GetPixel(i, j); System.Drawing.Color newColor = System.Drawing.Color.FromArgb(255, pixelColor.R, pixelColor.G, pixelColor.B); StylusPoint currPoint = new StylusPoint(left + i * pointWidth, top + j * pointWidth); int preIndexInStroke = points.IndexOf(keyPoints[index > 0 ? index - 1 : 0]); int nextIndexInStroke = trackStroke.StylusPoints.IndexOf(keyPoints[index < keyPoints.Count - 1 ? index + 1 : keyPoints.Count - 1]); double distance = distanceP2Points(currPoint, points, preIndexInStroke, nextIndexInStroke); if (distance > imageHeight / 2) { newColor = System.Drawing.Color.FromArgb(0, pixelColor.R, pixelColor.G, pixelColor.B); } bitmapTarget.SetPixel(i, j, newColor); } } } else { //去除无用边界 int preIndexInStroke = points.IndexOf(keyPoints[index > 0 ? index - 1 : 0]); int nextIndexInStroke = trackStroke.StylusPoints.IndexOf(keyPoints[index < keyPoints.Count - 1 ? index + 1 : keyPoints.Count - 1]); StylusPoint middleKeyPoint = new StylusPoint(points[(preIndexInStroke + nextIndexInStroke) / 2].X, points[(preIndexInStroke + nextIndexInStroke) / 2].Y); double maxDistanceCurr2MiddleKP = 0; for (int i = 0; i < bitmapSource.Width; i++) { for (int j = 0; j < bitmapSource.Height; j++) { System.Drawing.Color pixelColor = bitmapSource.GetPixel(i, j); System.Drawing.Color newColor = System.Drawing.Color.FromArgb(255, pixelColor.R, pixelColor.G, pixelColor.B); StylusPoint currPoint = new StylusPoint(left + i * pointWidth, top + j * pointWidth); double distance = distanceP2Points(currPoint, points, preIndexInStroke, nextIndexInStroke); if (distance > imageHeight / 2) { newColor = System.Drawing.Color.FromArgb(0, pixelColor.R, pixelColor.G, pixelColor.B); } else { double DistanceCurr2PreKP = MathTool.getInstance().distanceP2P(currPoint, keyPoints[index - 1]); double DistanceCurr2CurrKP = MathTool.getInstance().distanceP2P(currPoint, keyPoints[index]); if (DistanceCurr2PreKP < DistanceCurr2CurrKP) { double DistanceCurr2MiddleKP = MathTool.getInstance().distanceP2P(currPoint, middleKeyPoint); if (DistanceCurr2MiddleKP > maxDistanceCurr2MiddleKP) { maxDistanceCurr2MiddleKP = DistanceCurr2MiddleKP; } } } bitmapTarget.SetPixel(i, j, newColor); } } //添加渐变效果 for (int i = 0; i < bitmapSource.Width; i++) { for (int j = 0; j < bitmapSource.Height; j++) { System.Drawing.Color pixelColor = bitmapTarget.GetPixel(i, j); if (pixelColor.A != 0) { System.Drawing.Color newColor = System.Drawing.Color.FromArgb(255, pixelColor.R, pixelColor.G, pixelColor.B); StylusPoint currPoint = new StylusPoint(left + i * pointWidth, top + j * pointWidth); double DistanceCurr2PreKP = MathTool.getInstance().distanceP2P(currPoint, keyPoints[index - 1]); double DistanceCurr2CurrKP = MathTool.getInstance().distanceP2P(currPoint, keyPoints[index]); double distance = distanceP2Points(currPoint, points, preIndexInStroke, nextIndexInStroke); //为了衔接效果好,没有在前一副图片的点,不修改透明度 bool isInPreImage = MathTool.getInstance().isCloseRectangle(new Point(currPoint.X, currPoint.Y), MathTool.getInstance().RectToRectangle(new Rect(keyFrames[index - 1].Image.Margin.Left, keyFrames[index - 1].Image.Margin.Top, keyFrames[index - 1].Image.Width, keyFrames[index - 1].Image.Height)), 0); if (isInPreImage && maxDistanceCurr2MiddleKP != 0 && DistanceCurr2PreKP < DistanceCurr2CurrKP) { double DistanceCurr2MiddleKP = MathTool.getInstance().distanceP2P(currPoint, middleKeyPoint); double rate = 1 - DistanceCurr2MiddleKP / maxDistanceCurr2MiddleKP; newColor = System.Drawing.Color.FromArgb((byte)(255 * rate), pixelColor.R, pixelColor.G, pixelColor.B); } //if (distance <= imageHeight / 2 && distance >= imageHeight / 3) //{ // newColor = System.Drawing.Color.FromArgb(255, pixelColor.R, pixelColor.G, pixelColor.B); //} bitmapTarget.SetPixel(i, j, newColor); } } } } MemoryStream ms = new MemoryStream(); bitmapTarget.Save(ms, System.Drawing.Imaging.ImageFormat.Png); BitmapImage bitmapImage = new BitmapImage(); bitmapImage.BeginInit(); bitmapImage.StreamSource = new MemoryStream(ms.ToArray()); bitmapImage.EndInit(); keyFrames[index].Image.Source = bitmapImage; } }