问题标签 [drawingvisual]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
1137 浏览

wpf - 多线程图像合成

我正在使用 WPF 成像来使用 DrawingVisual 将文本、3d 图形和图像合成在一起。然后将结果呈现为 RenderTargetBitmap 并以 jpeg 格式保存到磁盘。所有这些都发生在没有可视窗口的代码中。

只要我一次只尝试做一件事,它就可以很好地工作。但是,我想看看是否可以通过使用多个线程进行渲染来加快速度。每个线程都使用一个创建自己的 DrawingContext、DrawingVisual 等的对象。但是,当我尝试并行访问它们时,显然在某处存在一些共享状态,因为我得到了虚假错误。有时它是“调用线程无法访问此对象,因为另一个线程创建了它”。其他时候,当我添加指向 3D 几何图形时,从 WPF 的内部冒出的 NullReferenceExceptions 看起来更邪恶。

有没有办法确保每个线程与 WPF 保持隔离?还是共享状态是不可避免的?

0 投票
1 回答
3376 浏览

c# - DrawText在DrawingContext中的一个角度?

因此,我使用以下代码获取现有图像,输入表单中的文本,然后将输入表单中的文本放置到现有图像上并将其另存为新图像:

如您所见,它调用以下函数来绘制文本:

现在我需要的很简单......我需要从中心位置以某个角度绘制 text2(并且只有 text2)。中心位置很简单,应该是:

那么,如果我想在中心位置旋转 -30 度角来绘制这个文本呢?请记住,我只想要旋转文本 2,而不是其他文本,也不是原始图像源。

0 投票
2 回答
4158 浏览

c# - 如何将 DrawingVisual 转换为位图?

使用 Visual C# 2010,我试图从从 Windows Kinect 接收的帧中编写一个 .avi 文件。使用 BitmapEncoder 和 PngBitmapEncoder(保存到流),可以很容易地将帧保存为 .png 文件,但我不能自行决定将这些图像添加到此处提供的 VideoStream: http://www.codeproject。 com/Articles/7388/A-Simple-C-Wrapper-for-the-AviFile-Library ,因为我需要能够将 RenderTargetBitmap 或 DrawingVisual 转换为 System.Drawing.Bitmap。

我找到了做类似事情的示例代码,但它们似乎都想实例化 Visual Studio 告诉我的 Image 类是抽象的并且无法实例化。

我绕着圈子转,什么也没有。

我只想做这样的事情:

但是 Bitmap 没有有用的构造函数来让我从 dv (DrawingVisual) 到 bmp。:(

这 3 行来自此代码段:

0 投票
0 回答
891 浏览

wpf - WPF 绘图在某些机器上的视觉性能

我正在开发一个应用程序,它需要以网格的形式绘制大约 70k 个矩形(一个网格 40x250 和一个 250x250)。当时并非所有矩形都在屏幕上可见。

阅读http://msdn.microsoft.com/en-us/magazine/dd483292.aspx后,我创建了简单的控件(从 FrameworkElement 继承,部分在下面列出),它使用 DrawingVisual descant 创建一列矩形。

所有画笔都被冻结(Brushes类成员)并被_strokePen冻结。每 200 毫秒将新的垂直条纹添加到集合中。

程序已在 3 台计算机上运行:

  1. 笔记本电脑:i7-2670QM、GeForce GT 540M/Intel HD Graphics 3000、4GB RAM、Win7 x64、DirectX11、
  2. PC:Core2Duo E7400、Radeon HD 4800、3GB RAM、Win7 x64、DirectX11、
  3. PC:i3 3,07GHz,Inter HD Graphics,3.3GB RAM,Win7 x86,DirectX11。

问题是,在我的第一台计算机上,程序运行平稳,对 CPU 没有太大影响(使用率在 1-10% 之间)。在第二台和第三台计算机上,程序的性能都是不可接受的:大约 30x100 的网格占用了 50% 的处理器,而且一切运行速度都很慢。即使只有一小部分网格可见,程序也会运行缓慢。

看起来程序正在使用软件渲染(渲染线程正在使用 50% 的处理器),但RenderCapability.Tier >> 16返回 2,并RenderOption.ProcessRenderMode设置为Default. 也没有[HKCU/Software/Microsoft/Avalon.Graphics]可以禁用硬件加速的键。

是否可以运行此应用程序顺利列出的计算机?我还能做些什么来最大限度地提高该程序的性能?

更新

设置DrawingVisual.CacheMode = new BitmapCache();帮助很大。这是否意味着 CPU<=>GPU 通信是瓶颈?

0 投票
0 回答
909 浏览

c# - BitmapCacheBrush - 缓存后释放视觉?

我正在评估 WPF 在需要渲染数万个元素(矩形、线条、圆形)的应用程序中的使用。渲染需要快速,但可以完成一次并缓存 - 所以我发现 BitmapCacheBrush 是推荐的这样做方式。

但是,似乎当我渲染到 DrawingVisual 并更新 BitmapCacheBrush.Target 以使用它时,会保留 DrawingVisual 的内存。

将 DrawingVisual 缓存为位图后,有没有办法删除它?或另一种方法?(我查看了 RenderTargetBitmap 但显然不使用硬件加速渲染)

谢谢 AnonDev

0 投票
1 回答
4797 浏览

wpf - DrawingVisual 未显示在窗口内的 WPF 画布中

我创建了一个最小的项目,以便“开始”在 WPF 中使用 DrawingVisuals 进行绘图(到目前为止是非常初学者)。

我的项目仅包含主窗口的 XAML 和代码。该项目的唯一目的是打开一个窗口并显示一些填充可用空间的“信号噪声”。

MainWindow.xaml 是这样的:

后面的代码是这样的:

问题是:当窗口打开时,画布显示在中心,正如预期的那样(带有灰色背景),但没有绘制任何信号。此代码的先前版本使用路径几何可以正常工作,但使用 DrawingVisual 没有显示几何(甚至不包括用于调试的椭圆几何)。

谢谢阅读!

0 投票
1 回答
918 浏览

c# - 为什么不断删除和重新添加 DrawingVisual 会导致内存使用量不断增加?

我有一个 WPF 程序,它使用 aCanvas内的 a Window,覆盖成为 a Graphics_Canvas,如下所示:

(我确实是从网上某处得到的,但我不记得前一段时间在哪里了。)

无论如何,该程序允许用户通过用鼠标中键拖动来平移显示在 上的图形Graphics_Canvas,这将不断(只要他们继续平移)触发如下所示:

所以我不断删除然后重新添加dataVisual.

当我查看内存使用时,我注意到的是,四处移动会导致内存使用增加,虽然它确实再次下降,但它并没有完全恢复到以前的水平。当显示屏上根本没有任何内容时,这一点更加明显,并且持续有效地重新添加任何内容的内存使用量可能会上升到数百 MB,并且在平移停止时再次下降。

作为信息,我应该补充一点,它GetDataDrawingVisual()返回 a Visual,在其上绘制 a RenderTargetBitmap,它本身不会保留在该方法之外。

我的问题是为什么这会导致内存使用量变化如此之大?

目前这更像是一个奇怪的麻烦,但我可以预见,如果可用内存一开始就受到更多限制,这可能是一个问题。

任何见解将不胜感激。

* 更新 (21/03/2013) *

通过对 的试验Graphics_Canvas,似乎以下方法对未释放的内存量产生了相当大的影响:

如果我只是返回 anew DrawingVisual()作为测试,那么在重新绘制结束后,内存几乎可以恢复到原来的位置。

但是,删除这个方法只是意味着Canvas不会运行,我会得到一个错误。可能是.NET 在幕后某个地方引用了Visual从这个方法返回的内容,然后没有取消引用它?我该如何排序?(注意:我从未在我的代码中显式调用此方法,它是从其他地方调用的)。

0 投票
1 回答
19287 浏览

c# - 在 wpf 中将列动态添加到 DataGrid

我目前正在使用自定义画布,并且我必须添加一个表格,所以我认为 dataGrid 会很好。所以我想从“Datagrid”创建一个“表格”,用户可以在运行时将表格添加到画布。

到目前为止,我已经尝试使用列表填充 DataGrid 并成功。

如何在运行时将列添加到 Datagrid,以便在运行时使用文本框从用户那里获取列数和标题值,并根据文本框的值,数据网格应添加列和标题值。

实际上我想开发一个表格,其中用户传递列数和列标题,并且应该生成表格。

或者

“你能建议我一种我应该看的方式,以便使用 DrawingVisual 类“绘制”一个表格吗?

它是 GraphicsTable 类的一部分

0 投票
5 回答
25441 浏览

c# - WPF 中的快速 2D 图形

我需要在 WPF 中绘制大量的 2D 元素,例如线条和多边形。他们的立场也需要不断更新。

我在这里查看了许多答案,这些答案大多建议使用 DrawingVisual 或覆盖 OnRender 函数。为了测试这些方法,我实现了一个简单的粒子系统渲染 10000 个椭圆,我发现使用这两种方法的绘图性能仍然非常糟糕。在我的 PC 上,每秒的帧数不能超过 5-10 帧。当您考虑到我使用其他技术轻松绘制 1/2 百万个粒子时,这是完全不能接受的。

所以我的问题是,我是在违反 WPF 的技术限制还是我错过了什么?还有什么我可以使用的吗?欢迎任何建议。

这是我尝试过的代码

MainWindow.xaml 的内容:

MainWindow.xaml.cs 的内容:

0 投票
1 回答
587 浏览

wpf - WPF:快速清除具有数千个孩子的 VisualHost

在 WPF 应用程序中,我使用带有 Children 集合的 VisualHost。这个儿童系列包含大约 10000-30000 个绘图视觉对象。

绘制这些 DrawingVisuals 大约需要 600 毫秒。这对我来说没问题,但是通过 Clear() 清除 Children 集合大约需要 120 毫秒。与绘图时间相比,这在我看来非常缓慢。

有人知道如何加快清除儿童收藏吗?