WPF, C #: narysuj linię na istniejącej mapie bitowej w kontrolce obrazu


Mam bitmapę obrazu w kontrolce obrazu
Muszę narysować czerwoną linię na mapie bitowej za każdym razem, gdy klikam ją myszą, gdy klikam myszą.
Na początku myślałem o utworzeniu obiektu liniowego, ale stwierdziłem, że nie mogę dodać tej linii. Potrzebuję płótna. Ale jeśli umieszczę obraz na płótnie, moja mapa bitowa nie rozciąga się na całe płótno (odkryłem, że współrzędne mapy bitowej określają lokalizację na płótnie, więc moja mapa bitowa nie wyświetla się poprawnie).
Potem spróbowałem użyć grafiki
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();

Jednak nic nie jest rysowane na mojej mapie bitowej ........
Teraz myślę, że prawdopodobnie będę musiał umieścić bitmapę w tablicy, a następnie zmienić kolor piksela, aby uzyskać linię w mapie bitowej. Wierzę, że będzie to bardzo powolne.
W tej chwili próbuję coś zrobić z visualDrawing, ale nadal mi się to nie udało :-(
Jaki jest dobry sposób na pobranie ciągu znaków do istniejącej mapy bitowej w WPF C # ???? i jak to usunąć?
Byłbym wdzięczny za jakąkolwiek pomoc! Podziękować! Opublikowałem to już na stronie forum MS, ale nie ma jeszcze odpowiedzi.
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Po wykonaniu
Graphics.FromImage
tej klasy
Graphics
(a także
System.Drawing.Pen
) nie należy do WPF, są one częścią WinForms i wewnętrznie używają wywołań GDI + systemu Windows do malowania i nie mogą malować na WPF.
Jeśli nie pojawił się błąd podczas kompilowania pierwszej linii kodu, oznacza to, że
bitmapImg
jest prawdopodobnie
System.Drawing.Image
(z WinForms), a nie obrazem kontrola z WPF (
System.Window.Controls.Image
).
Jak już wspomniał Adrian, najprostszym sposobem prawdopodobnie byłoby użycie siatki:
<Grid>
<Image Source="your image"/>
<Line Name="line" Visibility="Hidden" Stroke="Red" StrokeThickness="1"/>
</Grid>

Następnie w module obsługi zdarzeń kliknięcia możesz uczynić linię widoczną i nadać jej żądane współrzędne:
line.Visibility = Visible;
line.X1 = mouse_x;
line.Y1 = mouse_y;
line.X2 = ...;
line.Y2 = ...;
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Możesz umieścić płótno z przezroczystym tłem na wierzchu BitmapImage, a następnie narysować linię w razie potrzeby.
Kod z pliku XAML:
<Grid>
<Image Source="C:\Users\sm143444\Desktop\download.jpg"/>
<Canvas Background="Transparent" x:Name="draw"/>
</Grid>

Kod z 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);
}

Wyjście
https://i.stack.imgur.com/QrCcw.png
Możesz też dodać ZIndex do swojego obrazu i linii, tak aby leżały na różnych warstwach płótna.

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się