专栏首页林德熙的博客WPF 如何在 WriteableBitmap 写文字 截图win form 方法

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

最近看到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祝威 - 博客园

使用不安全代码将 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%96%87%E5%AD%97.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。

本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接: https://lindexi.gitee.io ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • WPF 如何在 WriteableBitmap 写文字

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

    林德熙
  • win10 uwp 获得缩略图 文件缩略图视频小图

    有时候需要获得文件或视频的缩略图。 本文提供两个方法,用于获得文件的缩略图和截取视频指定时间的显示图片。

    林德熙
  • WPF 如何画出1像素的线

    如何有人告诉你,请你画出1像素的线,是不是觉得很简单,实际上在 WPF 上还是比较难的。 本文告诉大家,如何让画出的线不模糊

    林德熙
  • WPF 如何在 WriteableBitmap 写文字

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

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

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

    walterlv
  • Sqoop数据迁移工具的使用

    原文链接:https://foochane.cn/article/2019063001.html

    foochane
  • 工具 | 常用工具镜像网站又更新了(Golang、Chrome、VsCode、NDK等)

    最近Golang,Android NDK、Chrome以及VSCode等都更新了新版,为了让大家更好的下载这些新版本的工具软件,特地对这些工具等进行了一次更新。

    飞雪无情
  • 速读原著-HotSpot虚拟机对象探秘

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

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

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

    WindCoder
  • 工具 | Android Studio 2.3镜像更新,极速下载体验#2

    Android Studio 2.3发布了,更新了很多不错的功能,比如WebP的支持,AppLink助手等,,因为众所周知的原因,所以就第一时间更新了镜像,让大...

    飞雪无情

扫码关注云+社区

领取腾讯云代金券