专栏首页林德熙的博客WPF 如何在 WriteableBitmap 写文字

WPF 如何在 WriteableBitmap 写文字

最近看到WPF 使用不安全代码快速从数组转 WriteableBitmap 可以快速从数组转 WriteableBitmap 所以就让他画一些元素,但是发现元素有文字就没法了。 本文告诉大家如何在 WriteableBitmap 把文字画上去。

截图

这个方法是从 WriteableBitmapEx看到的,可以在页面创建一个 TextBlock 让他来显示文字,然后使用截图获得文字,把图片画到 WriteableBitmap 就好。

先创建一个对象

 var wb = new WriteableBitmap((int) 宽, (int) 高, 96, 96, PixelFormats.Pbgra32, null);

然后对文字截图

 var rtb = new RenderTargetBitmap(wb.PixelWidth, wb.PixelHeight, wb.DpiX, wb.DpiY, PixelFormats.Pbgra32);
 rtb.Render(txt);

然后从截图复制到 WriteableBitmap 可以使用不安全代码

   wb.Lock();
   rtb.CopyPixels(new Int32Rect(0,0, rtb.PixelWidth, rtb.PixelHeight), 
   wb.BackBuffer,
   wb.BackBufferStride * wb.PixelHeight,  wb.BackBufferStride);

   wb.AddDirtyRect(new Int32Rect(0, 0, (int)ActualWidth, (int)ActualHeight));
   wb.Unlock();

win form 方法

另一个方法是使用 win form 写文字然后使用 WPF 使用不安全代码快速从数组转 WriteableBitmap - 林德熙 把文字写到 WriteableBitmap ,这个方法比较简单

            var width = 100;
            var height = 50;

            Bitmap bmp = new Bitmap(width, height);
            FontFamily f = new FontFamily("微软雅黑");
            using (Graphics g = Graphics.FromImage(bmp))
            {
                g.DrawString("林德熙", new System.Drawing.Font(f, 10), Brushes.Black, 0, 0);
            }

            WriteableBitmap image = new WriteableBitmap(width, height, 96, 96, PixelFormats.Bgra32, null);
            CopyFrom(image, bmp);

上面的代码可能无法直接运行,于是我就给 CopyFrom 代码,代码实际是从WPF 使用不安全代码快速从数组转 WriteableBitmap - 林德熙 复制

      public static void CopyFrom(WriteableBitmap wb, Bitmap bitmap)
        {
            if (wb == null)
                throw new ArgumentNullException(nameof(wb));
            if (bitmap == null)
                throw new ArgumentNullException(nameof(bitmap));

            var ws = wb.PixelWidth;
            var hs = wb.PixelHeight;
            var wt = bitmap.Width;
            var ht = bitmap.Height;
            if (ws != wt || hs != ht)
                throw new ArgumentException("暂时只支持相同尺寸图片的复制。");

            var width = ws;
            var height = hs;
            var bytes = ws * hs * wb.Format.BitsPerPixel / 8;

            var rBitmapData = bitmap.LockBits(new System.Drawing.Rectangle(0, 0, width, height),
                ImageLockMode.ReadOnly, bitmap.PixelFormat);

            wb.Lock();
            unsafe
            {
                System.Buffer.MemoryCopy(rBitmapData.Scan0.ToPointer(), wb.BackBuffer.ToPointer(), bytes, bytes);
            }
            wb.AddDirtyRect(new Int32Rect(0, 0, width, height));
            wb.Unlock();

            bitmap.UnlockBits(rBitmapData);
        }

这样运行就可以看到文字,而且这个方法的性能比较好

因为我没有设置文字大小和显示的大小,所以看起来文字就没有那么清晰

但是说这个方法的速度比较好,实际也是很差

最近看到一个对 OpenGL 封装的 SharpGL ,感觉还不错,如果需要比较高的速度,那么推荐使用这个库

SharpGL(Opengl)入门之纹理星球 - BIT祝威 - 博客园


本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

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

    最近看到WPF 使用不安全代码快速从数组转 WriteableBitmap 可以快速从数组转 WriteableBitmap 所以就让他画一些元素,但是发现元素...

    林德熙
  • dotnet Roslyn 通过读取 suo 文件获取解决方案的启动项目

    本文来告诉大家一个黑科技,通过 .suo 文件读取 VisualStudio 的启动项目。在 sln 项目里面,都会生成对应的 suo 文件,这个文件是 OLE...

    林德熙
  • UWP WPF 解决 xaml 设计显示异常

    例如我创建一个用户控件 TsjcyubtnTtqtjem 那么就可以在构造函数添加下面代码

    林德熙
  • WPF 如何在 WriteableBitmap 写文字 截图win form 方法

    最近看到WPF 使用不安全代码快速从数组转 WriteableBitmap 可以快速从数组转 WriteableBitmap 所以就让他画一些元素,但是发现元素...

    林德熙
  • 使用不安全代码将 Bitmap 位图转为 WPF 的 ImageSource 以获得高性能和持续小的内存占用

    发布于 2017-11-09 15:25 更新于 2017-11...

    walterlv
  • 速读原著-HotSpot虚拟机对象探秘

    Java 是一门面向对象的编程语言,Java 程序运行过程中每时每刻都有对象被创建出来。在语言 层面上,创建对象通常(例外:克隆、反序列化)仅仅是一个 new...

    cwl_java
  • JVM-HotSpot虚拟机对象探秘

    虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并检查这个符号引用代表的类是否已被加载、解析和初始化过。若没有,则...

    WindCoder
  • go基础入门(四)

    先打印的顺序跟defer出现的顺序相反,这是为啥呢?其实defer是一个延缓处理的过程,采用压栈和出栈来完成整个流程。内部流程大致如下图

    大话swift
  • Swift入门:静态属性和方法

    在Swift中,您可以创建属于类型而不是类型实例的属性和方法。这有助于通过存储共享数据来有意义地组织数据。

    韦弦zhy
  • OpenFeign服务调用

    Feign 是一个声明式 WebService 客户端。使用 Feign 能让编写Web Service 客户端更加简单。

    乐心湖

扫码关注云+社区

领取腾讯云代金券