如何在wpf和c#中为BitmapImage添加形状

本文关键字:BitmapImage 添加 中为 wpf | 更新日期: 2023-09-27 18:24:56

我想为图像添加路径,因为我想在图像上绘制曲线。我不知道如何将曲线添加到图像中。我想在图像上绘制形状,不想使用画布。因为我想将行转换为光栅图像这是我的代码:

            Ellipse circle = new Ellipse();
            circle.BeginInit();
            circle.Height = 100;
            circle.Width = 100;
            circle.Stroke = System.Windows.Media.Brushes.Black;
            circle.StrokeThickness = 1.0;
            circle.Margin = new Thickness(0, 0, 0, 0);
            circle.EndInit();
             circle.Measure(new Size(200, 200));
 circle.Arrange(
      new Rect(new Size(200, 200)));
 circle.UpdateLayout();
 Line line = new Line();
 line.BeginInit();
 line.X1 = 0;
 line.Y1 = 0;
 line.X2 = 300;
 line.Y2 = 300;
 line.Stroke = System.Windows.Media.Brushes.Magenta;
 line.StrokeThickness = 1;
 line.EndInit();
 line.Measure(new Size(300, 300));
 line.Arrange(new
        Rect(new Size(300, 300)));
 SolidColorBrush blueBrush = new SolidColorBrush();
 blueBrush.Color = Colors.Blue;
 SolidColorBrush blackBrush = new SolidColorBrush();
 blackBrush.Color = Colors.Black;

 // Create a Path with black brush and blue fill
 Path bluePath = new Path();
 bluePath.BeginInit();
 bluePath.Stroke = blackBrush;
 bluePath.StrokeThickness = 3;
 bluePath.Fill = blueBrush;

 // Create a line geometry
 LineGeometry blackLineGeometry = new LineGeometry();
 blackLineGeometry.StartPoint = new Point(20, 200);
 blackLineGeometry.EndPoint = new Point(300, 200);

 // Create an ellipse geometry
 EllipseGeometry blackEllipseGeometry = new EllipseGeometry();
 blackEllipseGeometry.Center = new Point(80, 150);
 blackEllipseGeometry.RadiusX = 50;
 blackEllipseGeometry.RadiusY = 50;

 // Create a rectangle geometry
 RectangleGeometry blackRectGeometry = new RectangleGeometry();
 Rect rct = new Rect();
 rct.X = 80;
 rct.Y = 167;
 rct.Width = 150;
 rct.Height = 30;
 blackRectGeometry.Rect = rct;

 // Add all the geometries to a GeometryGroup.
 GeometryGroup blueGeometryGroup = new GeometryGroup();
 blueGeometryGroup.Children.Add(blackLineGeometry);
 blueGeometryGroup.Children.Add(blackEllipseGeometry);
 blueGeometryGroup.Children.Add(blackRectGeometry);

 // Set Path.Data
 bluePath.Data = blueGeometryGroup;
 bluePath.EndInit();
 bluePath.Measure(new Size(300, 300));
 bluePath.Arrange(new     Rect(new Size(300, 300)));
            RenderTargetBitmap RTbmap = new
               RenderTargetBitmap(200, 200, 96, 96,
                 PixelFormats.Default);
            RTbmap.Render(bluePath);
            var renderTargetBitmap = RTbmap;
            var bitmapImage = new BitmapImage();
            var bitmapEncoder = new BmpBitmapEncoder();
            bitmapEncoder.Frames.Add(BitmapFrame.Create(renderTargetBitmap));
            using (var stream = new System.IO.MemoryStream())
            {
                bitmapEncoder.Save(stream);
                stream.Seek(0, System.IO.SeekOrigin.Begin);
                bitmapImage.BeginInit();
                bitmapImage.CacheOption = BitmapCacheOption.OnLoad;
                bitmapImage.UriSource = new Uri("C:''Users''ErnaGroup.Com''Pictures''Pictures''cartoon-ice-cream-3 - Copy.jpg"); // I want to add line to this image.
                bitmapImage.StreamSource = stream;
                bitmapImage.EndInit();
            }
            image1.Source = bitmapImage;
        }

我该怎么做?

如何在wpf和c#中为BitmapImage添加形状

Image不是容器控件。你肯定需要像Canvas这样的容器控件来容纳你的形状。

或者,您可以使用ImageBrush将BitmapImage设置为画布背景,并在画布上绘制Path/Line/Ellipse,稍后您可以将画布上的绘图保存为JPG图像。

<Canvas>
    <Canvas.Background>
        <ImageBrush ImageSource="Your BitmapImage Path"></ImageBrush>
    </Canvas.Background>
</Canvas>

然后您可以将修改后的数据保存为JPG图像

public static void CreateBitmapFromVisual(Visual target, string filename)
{
    // target will be your Canvas
    // filename is the path where you want to save the image
    if (target == null)
        return;
    Rect bounds = VisualTreeHelper.GetDescendantBounds(target);            
    RenderTargetBitmap rtb = new RenderTargetBitmap((Int32)bounds.Width, (Int32)bounds.Height, 96, 96, PixelFormats.Default);
    rtb.Render(target);            
    JpegBitmapEncoder jpg = new JpegBitmapEncoder();
    jpg.Frames.Add(BitmapFrame.Create(rtb));
    using (Stream stm = File.Create(filename))
    {
        jpg.Save(stm);
    }
}