首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

获取wpf WriteableBitmap的DrawingContext

在WPF中,可以使用WriteableBitmap来创建一个可编辑的位图,然后使用DrawingContext来绘制图形。以下是一个简单的示例代码:

代码语言:csharp
复制
WriteableBitmap wb = new WriteableBitmap(width, height, 96, 96, PixelFormats.Pbgra32, null);
DrawingVisual dv = new DrawingVisual();
using (DrawingContext dc = dv.RenderOpen())
{
    // 在这里绘制图形
    dc.DrawRectangle(Brushes.Red, null, new Rect(0, 0, 100, 100));
}
wb.Lock();
dv.Draw();
wb.AddDirtyRect(new Int32Rect(0, 0, width, height));
wb.Unlock();

在上面的代码中,我们首先创建了一个WriteableBitmap对象,然后创建了一个DrawingVisual对象,并使用RenderOpen方法获取DrawingContext对象dc。在dc上面,我们可以使用绘制图形的方法,例如DrawRectangle方法来绘制一个矩形。最后,我们调用DrawingVisual对象的Draw方法,将绘制的图形渲染到WriteableBitmap对象中。

需要注意的是,在绘制图形时,我们需要使用Lock和Unlock方法来锁定和解锁WriteableBitmap对象,以避免在绘制过程中出现异常。此外,我们还可以使用AddDirtyRect方法来标记需要重新绘制的区域。

总之,使用WriteableBitmap和DrawingContext可以方便地在WPF中绘制图形,并且可以实现高效的图形渲染。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

WPF 如何在 WriteableBitmap 写文字

最近看到WPF 使用不安全代码快速从数组转 WriteableBitmap 可以快速从数组转 WriteableBitmap 所以就让他画一些元素,但是发现元素有文字就没法了。...截图 这个方法是从 WriteableBitmapEx看到,可以在页面创建一个 TextBlock 让他来显示文字,然后使用截图获得文字,把图片画到 WriteableBitmap 就好。...(0, 0, (int)ActualWidth, (int)ActualHeight)); wb.Unlock(); win form 方法 另一个方法是使用 win form 写文字然后使用 WPF...image, bmp); 上面的代码可能无法直接运行,于是我就给 CopyFrom 代码,代码实际是从WPF 使用不安全代码快速从数组转 WriteableBitmap - 林德熙 复制 public...因为我没有设置文字大小和显示大小,所以看起来文字就没有那么清晰 但是说这个方法速度比较好,实际也是很差 最近看到一个对 OpenGL 封装 SharpGL ,感觉还不错,如果需要比较高速度,那么推荐使用这个库

1.8K10
  • WPF 如何在 WriteableBitmap 写文字

    最近看到WPF 使用不安全代码快速从数组转 WriteableBitmap 可以快速从数组转 WriteableBitmap 所以就让他画一些元素,但是发现元素有文字就没法了。...截图 这个方法是从 WriteableBitmapEx看到,可以在页面创建一个 TextBlock 让他来显示文字,然后使用截图获得文字,把图片画到 WriteableBitmap 就好。...image, bmp); 上面的代码可能无法直接运行,于是我就给 CopyFrom 代码,代码实际是从WPF 使用不安全代码快速从数组转 WriteableBitmap - 林德熙 复制 public...那么推荐使用这个库 SharpGL(Opengl)入门之纹理星球 - BIT祝威 - 博客园 使用不安全代码将 Bitmap 位图转为 WPF ImageSource 以获得高性能和持续小内存占用...- walterlv专栏 - CSDN博客 基于WriteableBitmap对象类采用擦写内存方式,低开销更新WPF Image UI控件 - Ivan_Whisper博客 - CSDN博客

    47910

    WPF 使用 Skia 绘制 WriteableBitmap 图片

    本文告诉大家如何在 WPF 中使用 SkiaSharp 调用 Skia 这个全平台底层渲染框架,使用绘制命令在 WriteableBitmap 图片上绘制内容 谷歌提出了 Skia 全平台渲染框架,这是一个很底层框架...那么如何在 WPF 使用 SkiaSharp 绘制出 WriteableBitmapWPF 中使用?...Surface 概念,也就是可以将绘制命令输入到 Skia 绘制到 Surface 上,而绘制内容将会作为像素数组放在传入数组里面 小伙伴是否还记得 WPF 使用不安全代码快速从数组转 WriteableBitmap...方法,其实 Skia 在 WriteableBitmap 绘制本质就是这样 在开始绘制之前需要调用 WriteableBitmap Lock 方法,接着在绘制完成之后,需要调用 AddDirtyRect...Xamarin 中集成 Skia 成熟度是最高 ---- 本文会经常更新,请阅读原文: https://blog.lindexi.com/post/WPF-%E4%BD%BF%E7%

    2.3K20

    WPF 如何在 WriteableBitmap 写文字 截图win form 方法

    最近看到WPF 使用不安全代码快速从数组转 WriteableBitmap 可以快速从数组转 WriteableBitmap 所以就让他画一些元素,但是发现元素有文字就没法了。...image, bmp); 上面的代码可能无法直接运行,于是我就给 CopyFrom 代码,代码实际是从WPF 使用不安全代码快速从数组转 WriteableBitmap - 林德熙 复制 public...SharpGL(Opengl)入门之纹理星球 - BIT祝威 - 博客园 使用不安全代码将 Bitmap 位图转为 WPF ImageSource 以获得高性能和持续小内存占用 - walterlv...专栏 - CSDN博客 基于WriteableBitmap对象类采用擦写内存方式,低开销更新WPF Image UI控件 - Ivan_Whisper博客 - CSDN博客 ---- 本文会经常更新...,请阅读原文: https://lindexi.gitee.io/post/WPF-%E5%A6%82%E4%BD%95%E5%9C%A8-WriteableBitmap-%E5%86%99%E6%

    64720

    WPF 自己封装 Skia 差量绘制控件

    WPF 中最稳方法就是通过 WriteableBitmap 作为承载绘制。本文告诉大家如何封装一个支持差量绘制控件,默认绘制方法都是每次都是不保存上次绘制内容,而且清空画布,重新绘制。...这样绘制方法显然效率不够高 在上一篇博客里面告诉大家如何在 WPF 中使用 Skia 绘制,请看 WPF 使用 Skia 绘制 WriteableBitmap 图片 而这样绘制方式意味着每次都需要重新绘制画布...而如果能了解绘制界面范围的话,可以使用 WriteableBitmap AddDirtyRect 方法,通过这个方法可以让 WPF 层仅更新指定范围内容 虽然 Skia 和 WPF 两个绘制效率都很高...在 WPF 中最简单绘制 WriteableBitmap 方法就是使用 Image 控件了 下面写一个继承 Image 控件 SkiaCanvas 控件 这个控件十分简单,在 Loaded 事件里面将会创建...这部分绘制逻辑有一个优势在于不需要等待绘制时机,随时都可以进行绘制。而 WPF 将会在框架层绘制命令收集时自动更新和收集。

    1.1K30

    dotnet 读 WPF 源代码笔记 了解 WPF 已知问题 后台线程创建 WriteableBitmap 锁住主线程

    WPF 中,如果在没有开启 Dispatcher 后台线程里面创建 WriteableBitmap 对象,在 WriteableBitmap 构造函数传入在主线程创建 BitmapSource...本文将通过 WPF 框架源代码告诉大家为什么会锁住主线程 这是在 WPF 开源仓库上一个小伙伴报,详细请看 WriteableBitmap hangs when source bitmap is rendered...原因是在后台线程创建 WriteableBitmap 时,会进入 WriteableBitmap.InitFromBitmapSource 方法,在这个方法里面获取了一个主线程后续将会等待锁。...然而后台线程后续需要等待主线程返回,才能完成创建图片,因此主线程在等待后台线程锁而后台线程在等待主线程返回,两个线程在等待 通过 WPF 仓库源代码可以看到 WriteableBitmap.InitFromBitmapSource..._syncObject 和在后台线程获取 SyncObject 是相同对象,因此主线程需要等待后台线程。

    55820

    WPF 使用 Skia 解析绘制 SVG 图片

    本文告诉大家如何在 WPF 里面,使用 Skia 解析绘制 SVG 图片。...本文也适合控制台使用 SkiaSharp 解析绘制 SVG 图片,本文 WPF 部分只是在 Skia 绘制完成之后,将 Skia 内容绘制到 WPF WriteableBitmap 图片,从而在界面显示...另一个库是 Svg.Skia 库,这是给 Skia 专用库 接下来咱将使用这个 Svg.Skia 库,在 WPF 应用里,加载 SVG 文件,使用 Skia 渲染 按照惯例第一步就是安装 NuGet...SKSvg 就是 Svg.Skia 提供类型 为了方便进行渲染,获取到 SVG 尺寸,先转换为 SKBitmap 类型。...参数基本上就是约定了像素数据表示和透明度支持 拿到 SKBitmap 对象,再根据 WPF 使用 Skia 绘制 WriteableBitmap 图片 提供方法进行绘制 var writeableBitmap

    1.8K30

    dotnet 读 WPF 源代码笔记 WriteableBitmap 渲染和更新是如何实现

    WPF 框架提供方便进行像素读写 WriteableBitmap 类,本文来告诉大家在咱写下像素到 WriteableBitmap 渲染,底层逻辑 之前我使用 WriteableBitmap 进行...在 WPF 和 UWP 中提供 WriteableBitmap 是支持对像素写入而更改渲染图片,当然,本文只聊 WPF 源代码,关于 UWP 部分,咱只知道使用就可以。...通过 WriteableBitmap 可以用来实现高性能 CPU 渲染,以下是我其他 WriteableBitmap 博客 WPF 使用 Skia 绘制 WriteableBitmap 图片 WPF...如何在 WriteableBitmap 写文字 WPF 使用不安全代码快速从数组转 WriteableBitmapWriteableBitmap 进行绘制时,有一个重要功能是设置 DirtyRect...来告诉 WPF 层,当前需要更新WriteableBitmap 哪个内容。

    89220

    dotnet 读 WPF 源代码笔记 渲染收集是如何触发

    方法返回 DrawingContext 对象里面,传入参数属性值影响渲染结果,是一次性,还是持续?...答案是或否就决定了 WPF 底层实现行为,是否在 DrawingContext 关闭时候,就直接触发渲染模块,或者就取出了传入数据,断开和传入值之间影响。...可以从 github 获取本文以上测试代码,获取代码之后,请将 WPFDemo 作为启动项目 以上就是本文构建测试逻辑。...如命名,此 MediaContext 类型就是 WPF 渲染上层渲染上下文,依靠此渲染上下文可以用来控制 WPF 多媒体(渲染)层行为 在 WPF 框架里面可以随处见到从 Dispatcher 里面获取...,在 WPF 调用 DrawingContext 关闭时,此时不会立刻执行界面渲染逻辑。

    82110

    WPF 修改图片颜色

    本文告诉大家如何修改图片颜色,如去掉图片蓝色 在 WPF 可以使用很多图片处理方法,本文告诉大家是一个图片处理,可以把处理图片保存在文件。...在阅读本文,我假设大家是熟悉 WPF ,至少了解 C# ,也知道图片格式。...在 WPF 可以使用 ARBG 数组表示图片,本文修改图片颜色方法就是使用 ARBG 数组方法修改,修改里面的元素值。...,一个图片像素就是writeableBitmap.PixelWidth * writeableBitmap.PixelHeight 。...(); } 去掉蓝色图片 代码:WPF 修改图片颜色 1.2-CSDN下载 现在程序看起来还不能使用,尝试添加几个依赖属性,用来修改图片颜色 可以点击这里下载程序 WPF 修改图片

    1.4K20

    WPF 使用 VisualBrush 在 4k 加 200 DPI 设备上某些文本不渲染看不见问题

    直接或间接 绘制到 VisualBrush 中 在 WPF 底层文本绘制都是采用 GlyphRun 绘制,因此可以认定为影响为全部文本,以及对应文本控件 现象: 有某些文本内容不绘制渲染出来,看不见某些文本内容...如上文所述,这是因为 DrawingContext 对象是从 DrawingVisual 里面获取,而 DrawingVisual RenderOpen 返回是一个带 RenderData 收集器...WPF 无视贴图命中测试特性,而提升性能 但是带来问题就是存在某些 GlyphRun 文本不绘制,在相同 drawingContext 绘制点和线是可见,只有文本看不到 其中最优解决方法是干掉...此问题只有在使用特定图表内容(很复杂)再加上放入到我某个特定应用里面才能复现,要调试 WPF 层的话,必须加入到我应用层才能开始调试此问题。...因此预计我也不会继续往底层调试,告诉大家具体原因 ---- 本文会经常更新,请阅读原文: https://blog.lindexi.com/post/WPF-%E4%BD%BF%E7%

    85320

    WPF 使用不安全代码快速从数组转 WriteableBitmap

    本文告诉大家一个快速方法,直接把数组转 WriteableBitmap 先来说下以前方法,以前使用是 BitmapSource ,这个方法是大法官方提供。...使用不安全代码转换是把数组直接复制到WriteableBitmap,请看使用不安全代码将 Bitmap 位图转为 WPF ImageSource 以获得高性能和持续小内存占用 - walterlv...如果已经拿到了数组,知道数组存放,那么就可以直接把数组复制到 WriteableBitmap 就可以显示。...这就是PixelFormat指定类型,可以使用Bgra32或者其他格式,不过指定了格式就需要数组存放和指定一样 因为没有直接从数组转 WriteableBitmap 所以需要先把数组转 Bitmap...,因为只是把他数据转换到 WriteableBitmap 所以不需要指定他数据 获得 Bitmap 就可以把他转 WriteableBitmap ,请看下面的代码 unsafe

    94710

    WPF 高性能位图渲染 WriteableBitmap 及其高性能用法示例

    WPF 渲染框架并没有对外提供多少可以完全控制渲染部分,目前可以做有: D3DImage,用来承载使用 DirectX 各个版本渲染内容控件 WriteableBitmap,通过一段内存空间来指定如何渲染一个位图图片...HwndHost,通过承载一个子窗口以便能叠加任何种类渲染控件 本文将解释如何最大程度压榨 WriteableBitmapWPF性能。...---- 如何使用 WriteableBitmap 创建一个新 WPF 项目,然后我们在 MainWindow.xaml 中编写一点可以用来显示 WriteableBitmap 代码: 1 2 3...启用不安全代码 为了获取最佳性能,我们需要开启不安全代码。为此,你需要修改一下你项目属性。...,这是 WPF 专门为 WriteableBitmap 而提供非托管代码双缓冲位图实现。

    1.7K70

    WPF 调用 InvalidateVisual 不触发 OnRender 原因

    而是等待 WPF 下一次更新界面就会触发控件刷新 换句话说,在调用 InvalidateVisual 方法时候不会立刻触发 OnRender 方法,需要等待下一次 Dispatcher Render...WPF 行为 本文代码放在 github 欢迎小伙伴访问 我创建了 Foo 类,继承 FrameworkElement 类,这样就能让这个 Foo 使用十分底层方法,也减少了 WPF 框架其他业务逻辑...drawingContext) { Render?....(formattedText, new Point()); base.OnRender(drawingContext); } } 然后写一个简单界面,这个界面包含...有的,如果使用 VisualBrush 获取元素显示状态,那么此时元素即使不在视觉树上也能进行显示,当然这也就出现了 VisualBrush 内存泄漏问题了,详细请看 wpf VisualBrush

    2.2K20

    WPF 给 Pen DashStyle 设置 0 0 虚线数组将会让渲染线程消耗大量 CPU 资源

    WPF Pen DashStyle 属性设置 0 0 虚线,在绘制几何图形时,绘制几何图形尺寸将关联渲染线程所使用 CPU 资源。...大约在周长大于 500 时,将可以从任务管理器上看到高 CPU 占用 感谢 Ryzen 大佬找到此问题,我只是帮他报告给 WPF 官方和记录工具人 在 WPF 里面,可以使用 DashStyle 属性实现虚线功能...(Brushes.Beige, pen, geometry); base.OnRender(drawingContext); } } 将以上 Foo...· dotnet/wpf 不过我预计这个问题也许会分给我去解决 本文所有代码放在github 和 gitee 欢迎访问 可以通过如下方式获取本文源代码,先创建一个空文件夹,接着使用命令行 cd 命令进入此空文件夹...,在命令行里面输入以下代码,即可获取到本文代码 git init git remote add origin https://gitee.com/lindexi/lindexi_gd.git git

    79920
    领券