问题标签 [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.
wpf - 多线程图像合成
我正在使用 WPF 成像来使用 DrawingVisual 将文本、3d 图形和图像合成在一起。然后将结果呈现为 RenderTargetBitmap 并以 jpeg 格式保存到磁盘。所有这些都发生在没有可视窗口的代码中。
只要我一次只尝试做一件事,它就可以很好地工作。但是,我想看看是否可以通过使用多个线程进行渲染来加快速度。每个线程都使用一个创建自己的 DrawingContext、DrawingVisual 等的对象。但是,当我尝试并行访问它们时,显然在某处存在一些共享状态,因为我得到了虚假错误。有时它是“调用线程无法访问此对象,因为另一个线程创建了它”。其他时候,当我添加指向 3D 几何图形时,从 WPF 的内部冒出的 NullReferenceExceptions 看起来更邪恶。
有没有办法确保每个线程与 WPF 保持隔离?还是共享状态是不可避免的?
c# - DrawText在DrawingContext中的一个角度?
因此,我使用以下代码获取现有图像,输入表单中的文本,然后将输入表单中的文本放置到现有图像上并将其另存为新图像:
如您所见,它调用以下函数来绘制文本:
现在我需要的很简单......我需要从中心位置以某个角度绘制 text2(并且只有 text2)。中心位置很简单,应该是:
那么,如果我想在中心位置旋转 -30 度角来绘制这个文本呢?请记住,我只想要旋转文本 2,而不是其他文本,也不是原始图像源。
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 行来自此代码段:
wpf - WPF 绘图在某些机器上的视觉性能
我正在开发一个应用程序,它需要以网格的形式绘制大约 70k 个矩形(一个网格 40x250 和一个 250x250)。当时并非所有矩形都在屏幕上可见。
阅读http://msdn.microsoft.com/en-us/magazine/dd483292.aspx后,我创建了简单的控件(从 FrameworkElement 继承,部分在下面列出),它使用 DrawingVisual descant 创建一列矩形。
所有画笔都被冻结(Brushes
类成员)并被_strokePen
冻结。每 200 毫秒将新的垂直条纹添加到集合中。
程序已在 3 台计算机上运行:
- 笔记本电脑:i7-2670QM、GeForce GT 540M/Intel HD Graphics 3000、4GB RAM、Win7 x64、DirectX11、
- PC:Core2Duo E7400、Radeon HD 4800、3GB RAM、Win7 x64、DirectX11、
- 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 通信是瓶颈?
c# - BitmapCacheBrush - 缓存后释放视觉?
我正在评估 WPF 在需要渲染数万个元素(矩形、线条、圆形)的应用程序中的使用。渲染需要快速,但可以完成一次并缓存 - 所以我发现 BitmapCacheBrush 是推荐的这样做方式。
但是,似乎当我渲染到 DrawingVisual 并更新 BitmapCacheBrush.Target 以使用它时,会保留 DrawingVisual 的内存。
将 DrawingVisual 缓存为位图后,有没有办法删除它?或另一种方法?(我查看了 RenderTargetBitmap 但显然不使用硬件加速渲染)
谢谢 AnonDev
wpf - DrawingVisual 未显示在窗口内的 WPF 画布中
我创建了一个最小的项目,以便“开始”在 WPF 中使用 DrawingVisuals 进行绘图(到目前为止是非常初学者)。
我的项目仅包含主窗口的 XAML 和代码。该项目的唯一目的是打开一个窗口并显示一些填充可用空间的“信号噪声”。
MainWindow.xaml 是这样的:
后面的代码是这样的:
问题是:当窗口打开时,画布显示在中心,正如预期的那样(带有灰色背景),但没有绘制任何信号。此代码的先前版本使用路径几何可以正常工作,但使用 DrawingVisual 没有显示几何(甚至不包括用于调试的椭圆几何)。
谢谢阅读!
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
从这个方法返回的内容,然后没有取消引用它?我该如何排序?(注意:我从未在我的代码中显式调用此方法,它是从其他地方调用的)。
c# - 在 wpf 中将列动态添加到 DataGrid
我目前正在使用自定义画布,并且我必须添加一个表格,所以我认为 dataGrid 会很好。所以我想从“Datagrid”创建一个“表格”,用户可以在运行时将表格添加到画布。
到目前为止,我已经尝试使用列表填充 DataGrid 并成功。
如何在运行时将列添加到 Datagrid,以便在运行时使用文本框从用户那里获取列数和标题值,并根据文本框的值,数据网格应添加列和标题值。
实际上我想开发一个表格,其中用户传递列数和列标题,并且应该生成表格。
或者
“你能建议我一种我应该看的方式,以便使用 DrawingVisual 类“绘制”一个表格吗?
它是 GraphicsTable 类的一部分
c# - WPF 中的快速 2D 图形
我需要在 WPF 中绘制大量的 2D 元素,例如线条和多边形。他们的立场也需要不断更新。
我在这里查看了许多答案,这些答案大多建议使用 DrawingVisual 或覆盖 OnRender 函数。为了测试这些方法,我实现了一个简单的粒子系统渲染 10000 个椭圆,我发现使用这两种方法的绘图性能仍然非常糟糕。在我的 PC 上,每秒的帧数不能超过 5-10 帧。当您考虑到我使用其他技术轻松绘制 1/2 百万个粒子时,这是完全不能接受的。
所以我的问题是,我是在违反 WPF 的技术限制还是我错过了什么?还有什么我可以使用的吗?欢迎任何建议。
这是我尝试过的代码
MainWindow.xaml 的内容:
MainWindow.xaml.cs 的内容:
wpf - WPF:快速清除具有数千个孩子的 VisualHost
在 WPF 应用程序中,我使用带有 Children 集合的 VisualHost。这个儿童系列包含大约 10000-30000 个绘图视觉对象。
绘制这些 DrawingVisuals 大约需要 600 毫秒。这对我来说没问题,但是通过 Clear() 清除 Children 集合大约需要 120 毫秒。与绘图时间相比,这在我看来非常缓慢。
有人知道如何加快清除儿童收藏吗?