WPF, C #: нарисуйте линию на существующем растровом изображении в элементе управления изображением - PullRequest
4 голосов
/ 08 марта 2011

У меня есть растровое изображение в элементе управления изображением

Мне нужно рисовать красную линию на растровом изображении каждый раз, когда я щелкаю мышью по нему в том месте, где я щелкнул мышью.

Сначала я подумал о создании объекта Line, но обнаружил, что не могу добавить Line. Мне нужен холст. Но если я помещаю свое изображение в холст, мое растровое изображение не растягивается по всему холсту (я обнаружил, что координаты растрового изображения определяют место на холсте, поэтому мое растровое изображение отображается неправильно).

Тогда я попробовал использовать графику

Graphics graphics = Graphics.FromImage(bitmapImg);
graphics.DrawLine(new System.Drawing.Pen(System.Drawing.Color.Red), 0, 0,  bitmapImg.Width, bitmapImg.Height); //not the line yet, just for testing
    graphics.DrawImage(bitmapImg, 0, 0, bitmapImg.Width,bitmapImg.Height);
        graphics.Dispose();

Однако я ничего не нарисовал на своем растровом изображении ........

Теперь я думаю, что мне, вероятно, нужно получить растровое изображение в массив, а затем изменить цвет пикселя, чтобы получить строку в растровом изображении. Я считаю, что это будет очень медленно.

Я сейчас что-то пробую с visualDrawing, однако у меня еще не получилось: - (

Какой хороший способ вставить строку в существующее растровое изображение в WPF C # ???? и как его убрать?

Буду рад любой помощи! Спасибо! Я уже разместил его на странице форума MS, но ответа пока нет.

Ответы [ 2 ]

4 голосов
/ 08 марта 2011

Когда вы делаете Graphics.FromImage, этот класс Graphics (а также System.Drawing.Pen) не принадлежат WPF, они являются частью WinForms, и они внутренне используют вызовы GDI + Windows для рисования и не могут рисовать сверху WPF.

Если вы не получили ошибку при компиляции первой строки вашего кода, то, вероятно, bitmapImg - это System.Drawing.Image (из WinForms), а не элемент управления изображениями из WPF (System.Window.Controls.Image).

Как уже упоминалось Адрианом, возможно, самым простым способом будет использование Grid:

<Grid>
    <Image Source="your image" />
    <Line Name="line" Visibility="Hidden" Stroke="Red" StrokeThickness="1" />
</Grid>

Затем в обработчике событий щелчка вы можете сделать линию видимой и задать ей нужные координаты:

line.Visibility = Visible;
line.X1 = mouse_x;
line.Y1 = mouse_y;
line.X2 = ...;
line.Y2 = ...;
0 голосов
/ 29 августа 2018

Вы можете поместить холст с прозрачным фоном поверх вашего BitmapImage, а затем нарисовать линию по мере необходимости. Код из файла xaml:

<Grid>
    <Image Source="C:\Users\sm143444\Desktop\download.jpg" />
    <Canvas Background="Transparent"  x:Name="draw" />
</Grid>

Код из Xaml.cs:

public MainWindow()
    {
        InitializeComponent();
        Point startPoint = new Point(50, 50);
        Line newLine = new Line();
        newLine.Stroke = Brushes.Black;
        newLine.Fill = Brushes.Black;
        newLine.StrokeLineJoin = PenLineJoin.Bevel;
        newLine.X1 = startPoint.X;
        newLine.Y1 = startPoint.Y;
        newLine.X2 = startPoint.X + 100;
        newLine.Y2 = startPoint.Y + 100;
        newLine.StrokeThickness = 2;
        this.draw.Children.Add(newLine);
    }

выход

Или вы можете даже добавить ZIndex к своему изображению и линии, чтобы они были наложены на разные слои на холсте.

...