【问题标题】:System.Drawing (GDI+) vs System.Windows.Media (WPF) vs Direct2D+DirectWrite+WICSystem.Drawing (GDI+) vs System.Windows.Media (WPF) vs Direct2D+DirectWrite+WIC
【发布时间】:2014-07-13 18:55:36
【问题描述】:

对于处理图像并用 C# 编写的 Desktop Vista+ 应用程序,您会推荐以下哪种技术(或组合_):System.Drawing (GDI+) vs System.Windows.Media vs Direct2D+DirectWrite+WIC . 图像处理将涉及各种原始绘制、填充、处理文本、旋转、平移、缩放、直接使用指针处理像素数据。总的来说,上述技术在处理位图方面效果如何?

另外,如果有人知道一个详细的比较图表,其中列出了并排的不同功能和等效功能,以及不支持的功能,那就太好了!例如,WPF 和 Direct2D 中是否有 ColorMatrix 等价物?例如,在研究了 SharpDX 的 Direct2D 实现之后,我的印象是,即使 Microsoft 将其定位为 GDI+ 的完全替代品,我也无法在 Direct2D 中找到 GDI+ 的所有功能。

另外,考虑到现在是 2014 年,您是否会说至少对于图像处理(如果不是 UI 部分,WPF 似乎是更好的选择),GDI+ 在接下来的 5 年左右是可以的?或者我真的应该考虑使用所有 3 种最有效的技术吗?

谢谢。

【问题讨论】:

  • Direct2D 中缺少 GDI+ 中的哪些功能?
  • GDI+ 不是图像处理,它只是 Win32 GDI 的封装,主要支持渲染 UI(不是图像)。所以功能相当有限。我认为你应该搜索一些 .NET 的图像库,使用这些库,你可以做任何你喜欢的操作(在图像上),比如执行一些复杂的变换,...​​... WPF 中的图形比 Winforms 中的要好得多,但是它也是面向用户界面的,而不是专注于图像。
  • @WaltRitscher Well 例如:HatchBrush、ColorMatrix、PathGradientBrush 等等。
  • @KingKing 对,但除了纯 GDI 的功能之外,它还有很多额外的功能。但你是对的,图像库将是一个很好的补充。但是有一些问题,例如,就图像/位图类型而言,最低公分母应该是什么 - 即由库提供的,Drawing.Bitmap,Media.Bitmap,WIC.Bitmap;还考虑到必须通过指针直接访问像素数据这一事实,并且应该可以廉价地将其转换为其他类型以利用 DirectText 等其他技术。有什么图书馆可以推荐的吗?

标签: .net wpf graphics gdi+ direct2d


【解决方案1】:

我目前在一个视觉密集型 C#/WPF 项目中工作,并且在 Python 中使用图像处理进行了一些业余爱好。

根据您的预期用途,我将使用以下方法:

  • 尽可能使用 WPF 命名空间,即System.Windows.Media。据我所知,System.Drawing 和 GDI+ 通常使用非托管资源,这可能会产生不希望的、可避免的问题;
  • 尽可能严格地使用 MVVM 架构。也就是说,您有一个仅用于显示信息的 View 层,以及包含业务逻辑的 Model 和 ViewModel 层。虽然有些人可能会说视觉的东西不属于 ViewModel 层,但如果您的应用程序处理图像的操作,那么您的业务逻辑 根据定义与视图相关(我花了很长时间才弄清楚这一点出)。
  • 如有疑问,请使用多维数组(在模型/视图模型中)执行图像处理并将这些数组绑定到视图(通过 DataBinding 使用 ValueConverter)。

这样,例如,您可以有一个ImageLayerViewModel 类来表示一个层,而Data 属性(或ValuePixelArrayRaster,无论如何)是一个double[height,width,depth]

我可以详细说明,但我不确定是否能正确回答您的问题,所以如果您愿意,请写下任何评论。

【讨论】:

  • 感谢您的发帖!但是我更关心图像处理方面而不是 UI。对于 UI,我可能会从 WinForms 过渡到 WPF。然而,这并不真正影响图像处理部分,因为理想情况下它应该是独立于 UI 的,甚至可能在服务的上下文中运行(GDI+ 和 WPF 都不能)。
  • 好吧,那么我的建议更多的是不使用System.Windows.Media[.Imaging] 命名空间来表示图像和图像内容。您可以将 ViewModel 属性设置为任何类型,这对您来说更方便(我发现双精度数组是数字运算的最佳选择),并且仅使用所述命名空间通过数据绑定和值转换器直观地呈现图像。如果您有足够的知识,您可以自己实现图像处理算法,而不是依赖于 .Net 图像命名空间提供的通常有限的方法。希望这会有所帮助!
猜你喜欢
  • 2012-10-28
  • 2010-12-17
  • 2012-01-26
  • 2010-10-22
  • 2019-10-06
  • 1970-01-01
  • 2020-03-18
  • 1970-01-01
  • 2011-05-20
相关资源
最近更新 更多