WPF,C# : Draw a line onto existing bitmap in image control

标签 wpf bitmap drawing

我在图像控件中有一个位图图像




每次我用鼠标点击位图时,我都需要在位图上画一条红线,在我点击鼠标的地方。

我首先想到创建一个 Line 对象,但发现我无法添加 Line。我需要一张 Canvas 。但是如果我把我的图像放在 Canvas 上,我的位图不会延伸到整个 Canvas 上(我发现,位图的坐标决定了 Canvas 上的位置,所以我的位图显示错误。)

然后我尝试使用图形

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 论坛页面上发布了它,但到目前为止还没有答案。

最佳答案

当您这样做时Graphics.FromImage , 这个 Graphics类(以及 System.Drawing.Pen )不属于 WPF,它们是 WinForms 的一部分,并且它们在内部使用 Windows 的 GDI+ 调用来绘制并且不能在 WPF 之上绘制。

如果您在编译代码的第一行时没有出现错误,那么可能是您的 bitmapImgSystem.Drawing.Image (来自 WinForms)不是来自 WPF 的 Image 控件( System.Window.Controls.Image )。

正如阿德里安提到的,最简单的方法可能是使用网格:

<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 = ...;

关于WPF,C# : Draw a line onto existing bitmap in image control,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5231086/

相关文章:

c# - 双击进度条后打开的窗口立即拖入后台

c# - MVVM 中的子窗口

c# - 当事件聚合器引发事件订阅时,如何限制事件订阅的数量?

java - SharedPreferences 不会发送位图 : Failed to allocate memory

ios - 在 Swift 中连续绘制 UIBezierPath 期间消除滞后延迟

c# - 如何解决在命名空间中找不到的 'CrmServerLoginControl'?

c++ - Create Memory Device Context... 用于位图,而不是设备(不显示)

android - 在android中绘制镜像位图

c - 在C中,使用GDimage绘制线条,绘制一条线并产生其他线而不重复的好方法是什么?

java - 在 Java 中绘制屏幕