我正在尝试编写一个绘图应用程序,允许用户在画布上选择两个点,并在这些点之间逐像素绘制一条线。在WinForms中,这将是一个简单的解决方案-创建一个画布,获取其位图,使用
进行绝地教士的事情:这不是某个学生试图将他的工作推卸给其他人。你可以继续你的事情。
SetPixel
方法在位图上绘制,并替换画布位图。我想知道是否有一种类似的方法可以在AvaloniaUI中实现?据我所知,它在幕后使用SkiaSharp。然而,渲染SKCanvas
在Avalonia.Controls.Canvas
上的解决方案似乎很困难。虽然SKBitmap
也具有SetPixel
方法。问题不在于如何绘制线条-而在于如何在AvaloniaUI
中的位图上设置单个像素,并将此位图设置为Avalonia.Controls.Canvas
。
以下是我找到的一些链接:
- https://github.com/AvaloniaUI/Avalonia/pull/2371 - AvaloniaUI pull request #2371
- https://github.com/AvaloniaUI/Avalonia/issues/2492 - AvaloniaUI issue #2492
- AvaloniaUI - 如何直接在画布上绘制 - 不幸的是,我不被允许在画布本身上绘制。
- Avalonia WriteableBitmap BitmapContext 上的工件 - 不安全代码、三个扩展方法……而一个选项似乎有点太复杂了。
P.S. 尽管官方文档示例中的逐个大小为 1x1 的矩形绘制(https://docs.avaloniaui.net/docs/controls/canvas)听起来很诱人,但大学也不允许这样做。
P.P.S.我并不是要求任何人替我完成作业-如果你担心这一点,请将其视为框架比较问题,而不是“请替我做这个”的问题。我已经找到并链接了可以使用的解决方案-只是我觉得应该有更简单的方法来实现我所需的结果。这就是我提出这个问题的原因-以防我错过了什么。进行绝地教士的事情:这不是某个学生试图将他的工作推卸给其他人。你可以继续你的事情。
SetPixel
方法。不幸的是,在任何本地AvaloniaUI
位图中都没有这样的方法。它在SkBitmap
和System.Drawing.Bitmap
上,但是在不同位图类型之间进行转换似乎不是一个简洁的解决方案(我链接的示例展示了如何实现这一点)。关于绘制线条:这不是我的问题的一部分 - 您描述的所有内容实际上都是任务的一部分 - 使用SetPixel
实现正确的线条绘制、抗锯齿和线条粗细修改算法。我知道如何做。 - Kiryl Volkauunsafe
代码进行像素复制,并需要三个额外的扩展方法。这确实是一个选项 - 不过,我认为框架应该有一些东西可以直接使用,而不需要用户重新发明轮子。我仍然希望我在文档中错过了什么,或者有一个大师知道“方法”。我还将在原始问题中添加此引用,并解释为什么这不是我要找的内容。 - Kiryl VolkauSetPixel
或一个一个设置像素的函数,那么这实际上似乎是一个关于如何从SkBitmap
或System.Drawing.Image
转换为Avalonia图像的问题,因为后者不提供这样的方法。同时,你声称已经找到了解决方案,但似乎有困难使用它们 - 我建议通过指出你找到的代码并遇到的问题来集中精力解决这个问题,否则问题就太不清楚和无法回答了。 - RaywriteableBitmap
是一个值得探索的好方向。 - Lee Taylor