0

画像上に曲線を作りたいので、画像にパスを追加したいです。画像に曲線を追加する方法がわかりません。画像に形を描きたいのですが、キャンバスは使いたくないです。線をラスター画像に変換したいので、これは私のコードです:

            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;
        }

これどうやってするの?

4

1 に答える 1

2

画像はコンテナー コントロールではありません。シェイプを保持するには、Canvas のようなコンテナ コントロールが必ず必要です。

または、ImageBrush を使用して BitmapImage を Canvas の背景として設定し、Canvas に Path/Line/Ellipse を描画し、後で Canvas に描画を 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);
    }
}
于 2013-07-26T06:09:19.037 に答える