如何使用图形对象渲染 WPF Hwnd

2023-12-31

之后RenderTargetBitmap就太慢了。我尝试了一种不同的方法。不幸的是我的尝试没有成功。希望你们中的一些人能够弄清楚为什么这段代码不起作用。

  var myPopup = new Popup();
            var child = new Grid() { Background = new VisualBrush(myVisual)};
            myPopup.StaysOpen = false;
            myPopup.Child = child;
            myPopup.IsOpen = false;

            myPopup.Opened += (sender, args) =>
            {
                var source = ((HwndSource)PresentationSource.FromVisual(myPopup.Child));
                var image = new Bitmap(1000,1000);
                using (Graphics gr = Graphics.FromHwnd(source.Handle))
                {
                    var ptr = gr.GetHdc();

                    using (Graphics g = Graphics.FromHdc(ptr))
                    {
                        g.DrawImage(image, new System.Drawing.Point(0, 0));
                    }
                    gr.ReleaseHdc(ptr);
                }
                //The image is just black...
                image.Save("test.png");

                myPopup.IsOpen = false;
            };
            myPopup.IsOpen = true;

恐怕你的代码无法工作。事实上,您正在将空图像复制到Graphics然后将该图像保存到文件中。所以文件是空的。

如果您不想使用渲染目标位图 https://msdn.microsoft.com/it-it/library/system.windows.media.imaging.rendertargetbitmap(v=vs.110).aspx,那么你需要使用BitBlt https://msdn.microsoft.com/en-us/library/windows/desktop/dd183370(v=vs.85).aspx功能。

让我们看看如何做。首先,让我们创建一个帮助器类来管理从 Visual 到 Bitmap 的转换:

public static class VisualToBitmapConverter
{
    private enum TernaryRasterOperations : uint
    {
        SRCCOPY = 0x00CC0020,
        SRCPAINT = 0x00EE0086,
        SRCAND = 0x008800C6,
        SRCINVERT = 0x00660046,
        SRCERASE = 0x00440328,
        NOTSRCCOPY = 0x00330008,
        NOTSRCERASE = 0x001100A6,
        MERGECOPY = 0x00C000CA,
        MERGEPAINT = 0x00BB0226,
        PATCOPY = 0x00F00021,
        PATPAINT = 0x00FB0A09,
        PATINVERT = 0x005A0049,
        DSTINVERT = 0x00550009,
        BLACKNESS = 0x00000042,
        WHITENESS = 0x00FF0062,
        CAPTUREBLT = 0x40000000
    }

    [DllImport("gdi32.dll", SetLastError = true)]
    [return: MarshalAs(UnmanagedType.Bool)]
    private static extern bool BitBlt(IntPtr hdc, int nXDest, int nYDest, int nWidth, int nHeight, IntPtr hdcSrc, int nXSrc, int nYSrc, TernaryRasterOperations dwRop);

    public static Bitmap GetBitmap(Visual visual, int width, int height)
    {
        IntPtr source;
        IntPtr destination;

        Bitmap bitmap = new Bitmap(width, height);
        HwndSource hwndSource = (HwndSource)PresentationSource.FromVisual(visual);
        using (Graphics graphicsFromVisual = Graphics.FromHwnd(hwndSource.Handle))
        {
            using (Graphics graphicsFromImage = Graphics.FromImage(bitmap))
            {
                source = graphicsFromVisual.GetHdc();
                destination = graphicsFromImage.GetHdc();

                BitBlt(destination, 0, 0, bitmap.Width, bitmap.Height, source, 0, 0, TernaryRasterOperations.SRCCOPY);

                graphicsFromVisual.ReleaseHdc(source);
                graphicsFromImage.ReleaseHdc(destination);
            }
        }

        return bitmap;
    }
}

现在我们可以编写一个简单的 XAML 来测试辅助类:

<Window x:Class="WpfApplication1.MainWindow" Name="win"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="400">

    <StackPanel>
        <Border BorderBrush="DarkGray" BorderThickness="4" CornerRadius="4"
                Background="LightGray" Padding="6" Name="border">
            <Label Content="Copy me to a bitmap file, please" FontSize="20" Foreground="Green"
                   FontStyle="Italic" />
        </Border>
        <Button Content="Save to file" Margin="20" HorizontalAlignment="Center"
                Click="Button_Click" />
    </StackPanel>

</Window>

其隐藏代码:

namespace WpfApplication1
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            Bitmap image = VisualToBitmapConverter.GetBitmap(border,
                (int)border.ActualWidth, (int)border.ActualHeight);

            image.Save(@"C:\YourPath\test.png");
        }
    }
}

如果单击该按钮,您将发现边框及其内容已复制到位图文件中。我希望这种方法的速度适合您的目的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用图形对象渲染 WPF Hwnd 的相关文章

  • 使用 ADAL v3 使用 ClientID 对 Dynamics 365 进行身份验证

    我正在尝试对我们的在线 Dynamics CRM 进行身份验证以使用可用的 API 我能找到的唯一关于执行此操作的官方文档是 https learn microsoft com en us dynamics365 customer enga
  • C#.Net 邮件将进入垃圾邮件文件夹

    我正在从 ASP net Web 应用程序发送电子邮件 邮件发送成功 没有失败 但大多数都进入了垃圾邮件文件夹 请帮助我克服垃圾邮件过滤器 我的发送邮件代码 public void SendMail string FromAddress s
  • 如何使用 openSSL 函数验证 PEM 证书的密钥长度

    如何验证以这种方式生成的 PEM 证书的密钥长度 openssl genrsa des3 out server key 1024 openssl req new key server key out server csr cp server
  • 在 Mono 中反序列化 JSON 数据

    使用 Monodroid 时 是否有一种简单的方法可以将简单的 JSON 字符串反序列化为 NET 对象 System Json 只提供序列化 不提供反序列化 我尝试过的各种第三方库都会导致 Mono Monodroid 出现问题 谢谢 f
  • MVC 5 中具有 ASP.NET Identity 的 Autofac 不会验证 OWIN 管道中的安全标记

    我在 MVC 5 中设置了 AutoFac 来与 ASP NET Identity 一起使用 表面上一切似乎都工作正常 即用户可以创建帐户并登录 但后来我发现 当安全标记更改时 用户不会注销 通过在 AspNetUsers 表中进行暴力破解
  • 为什么这个 makefile 在“make clean”上执行目标

    这是我当前的 makefile CXX g CXXFLAGS Wall O3 LDFLAGS TARGET testcpp SRCS main cpp object cpp foo cpp OBJS SRCS cpp o DEPS SRCS
  • Makefile 和 .Mak 文件 + CodeBlocks 和 VStudio

    我对整个 makefile 概念有点陌生 所以我对此有一些疑问 我正在 Linux 中使用 CodeBlocks 创建一个项目 我使用一个名为 cbp2mak 的工具从 CodeBlocks 项目创建一个 make 文件 如果有人知道更好的
  • Linux 上的 RTLD_LOCAL 和dynamic_cast

    我们有一个由应用程序中的一些共享库构成的插件 我们需要在应用程序运行时更新它 出于性能原因 我们在卸载旧插件之前加载并开始使用新插件 并且只有当所有线程都使用旧插件完成后 我们才卸载它 由于新插件和旧插件的库具有相同的符号 我们dlopen
  • TextBlock TextWrapping 不换行 #2

    好吧 那么this https stackoverflow com questions 6625177 textblock textwrapping not wrapping解决方案没有帮助 XAML 在这里
  • 现代 UI WPF 导航

    我正在使用现代 ui wpf 并尝试从 CheckLogin xaml 页面导航到 MainWindow xaml 页面 它们位于解决方案根目录中 我在 CheckLogin xaml 中写了这样的内容 BBCodeBlock bbBloc
  • 在 azure blob 存储中就地创建 zip 文件

    我将文件存储在 Blob 存储帐户内的一个容器中 我需要在第二个容器中创建一个 zip 文件 其中包含第一个容器中的文件 我有一个使用辅助角色和 DotNetZip 工作的解决方案 但由于 zip 文件的大小最终可能达到 1GB 我担心在进
  • 让网络摄像头在 OpenCV 中工作

    我正在尝试让我的网络摄像头在 Windows 7 64 位中的 OpenCV 版本 2 2 中捕获视频 但是 我遇到了一些困难 OpenCV 附带的示例二进制文件都无法检测到我的网络摄像头 最近我发现这篇文章表明答案在于重新编译一个文件 o
  • 使用 gcc 时在头文件中查找定义的好方法是什么?

    在使用 gcc 时 有人有推荐的方法在头文件中查找定义吗 使用 MSVC 时 我只需右键单击并选择 转到定义 这非常好 我使用过 netbeans gcc 它确实有代码帮助 包括到定义的超链接 所以这是一种选择 但是 我想知道是否有任何其他
  • Xamarin Forms Binding - 访问父属性

    我无法访问页面的 ViewModel 属性以便将其绑定到 IsVisible 属性 如果我不设置 BindingContext 我只能绑定它 有没有办法可以在设置 BindingContext 的同时访问页面的 viewmodel root
  • 构建 C# MVC 5 站点时项目之间的处理器架构不匹配

    我收到的错误如下 2017 年 4 月 20 日构建 13 23 38 C Windows Microsoft NET Framework v4 0 30319 Microsoft Common targets 1605 5 警告 MSB3
  • 如何编写一个接受 int 或 float 的 C 函数?

    我想用 C 语言创建一个扩展 Python 的函数 该函数可以接受 float 或 int 类型的输入 所以基本上 我想要f 5 and f 5 5 成为可接受的输入 我认为我不能使用if PyArg ParseTuple args i v
  • 如何高效计算连续数的数字积?

    我正在尝试计算数字序列中每个数字的数字乘积 例如 21 22 23 98 99 将会 2 4 6 72 81 为了降低复杂性 我只会考虑 连续的数字 http simple wikipedia org wiki Consecutive in
  • 如何组合两个 lambda [重复]

    这个问题在这里已经有答案了 可能的重复 在 C 中组合两个 lambda 表达式 https stackoverflow com questions 1717444 combining two lamba expressions in c
  • 从后面的代码添加外部 css 文件

    我有一个 CSS 文件 例如 SomeStyle css 我是否可以将此样式表文档从其代码隐藏应用到 aspx 页面 您可以将文字控件添加到标头控件中 Page Header Controls Add new System Web UI L
  • 嵌入式linux编写AT命令

    我在向 GSM 模块写入 AT 命令时遇到问题 当我使用 minicom b 115200 D dev ttySP0 term vt100 时它工作完美 但我不知道如何在 C 代码中做同样的事情 我没有收到任何错误 但模块对命令没有反应 有

随机推荐

  • Git 标签发布版本?

    预发布版本可以通过紧跟在补丁版本后面附加破折号和一系列点分隔的标识符来表示 示例 1 0 0 alpha 1 0 0 alpha 1 1 0 0 0 3 7 1 0 0 x 7 z 92 semver org http semver org
  • 仅提交存储库根目录上的属性更改,而不是文件

    我有一个 SVN 存储库 其中包含未提交的文件更改 根文件夹上的 svn externals 属性也发生了变化 如何提交属性更改 而不提交对文件本身的更改 为了仅提交在命令行上指定的显式路径 请使用 depth empty选项例如在具有新修
  • Django 按两个字段对项目进行排序,但如果它们为零则忽略它们

    我有以下模型 为了解决这个问题而大大简化 class Product models Model price models DecimalField max digits 8 decimal places 2 sale price model
  • WindowBuilder 无法显示 GUI。无法加载组件 javax.swing.JFrame 的 *.wbp-component.xml 描述

    我使用的是 Eclipse 2021 9 版本 并且已经安装了 windowbuilder 当我单击设计器选项卡时会发生此错误 有谁能够帮助我 我遇到了同样的问题 我刚刚更新了 WindowBuilder Nightly Build 1 9
  • 如何在SASS中将整数转换为十六进制

    代替类似的东西地图数据结构 http chriseppstein github ioChris Eppstein 提到 SASS 正在进行的工作 我正在尝试实现类似的目标 将字符串映射到相应的十六进制值 该值将用于指定 CSS 的 unic
  • 如何在 Spring Boot 2.0 中注册自定义环境后处理器?

    我按照这个中的确切步骤进行操作文档 https docs spring io spring boot docs 1 5 x SNAPSHOT reference htmlsingle boot features application ev
  • IE8 中的 Jquery 问题

    Jquery 在 Safari 和 Firefox 中运行良好 在 IE8 中 使用开发人员工具 我收到错误 无法获取位置属性 无效参数 jquery 1 3 2 js 第 12 行字符 12949 通过调试 脚本突出显示字符 J G K
  • Kubernetes 配置:在代码存储库上与在 helm 图表存储库上

    Helm 被宣传为 管理 k8s 上应用程序部署的方式 我们的微服务具有代码存储库和可部署的 1 对 1 映射 我发现将 k8s 配置映射与代码一起使用要方便得多 以便它们一起发展 例如为功能标志添加新的环境变量时 然而 我们维护的是一个
  • Asp.net Core 自定义过滤器实现 IActionModelConvention 和 IFilterFactory

    我需要创建一个实现两者的自定义操作过滤器IActionModelConvention and IFilterFactory I use IActionModelConvention用于同时设置多条路线 我使用IFilterFactory注入
  • Java中忽略大小写

    我想知道如何使用户输入的任何内容在我的方法中忽略大小写 public static void findPatient if myPatientList getNumPatients 0 System out println No patie
  • 需要使用 Android 模拟器进行身份验证的代理

    有没有人设法让 Android 模拟器在需要身份验证的代理后面工作 我尝试将 http proxy 参数设置为 http DOMAIN USERNAME PASSWORD IP PORT 但我没有成功 我尝试按照文档进行操作 但没有成功 我
  • docker image ubuntu:16.04 似乎省略了 logrotate 的一些文件

    我根据以下内容构建了一个图像ubuntu 16 04 在构建图像时 我确实运行了一些命令 包括apt get y update 然后 我浏览图像docker run it myimage bash我发现有一些遗漏的文件logrotate在那
  • 使用 open cv Mat::at 时出现段错误

    我试图用一些值填充 opencv 矩阵 但我不断出现段错误 代码如下 Mat mask gx in window size in window size image type for int i 0 i lt in window size
  • Linux下多线程进程的信号SIGTERM处理

    我在Linux下调试一个多线程进程的信号处理时 发现了一种奇怪的现象 这个问题的一句话是 SIGTERM handler为空并且已成功注册到系统 但进程启动时仍可能被SIGTERM杀死 详细说明如下 该进程由父进程派生 并由execve 处
  • 同步两个ListView位置

    我有两个列表视图 当我滚动任何一个列表时 有什么方法可以同步 ListViews 的位置 实施一个AbsListView OnScrollListener http developer android com reference andro
  • Azure Web App:发布前删除所有文件

    使用以下 Powershell 脚本发布到 Azure Web App 时 我们经常会遇到问题 即先前发布的文件会导致运行时错误 param websiteName packOutput website Get AzureWebsite N
  • xunit 扩展/行测试发生了什么?

    在 NUnit 2 4 7 中 包含了 nunit framework extensions dll 这使得可以进行 RowTests 下载最新版本 2 5 8 时我找不到它 这是怎么回事 而不是使用RowTest 您可以使用TestCas
  • Solr/Lucene 是否可以先按相关性排序,然后再按第二个属性排序?

    在 Solr Lucene 中 是否可以首先按相关性排序 然后再按第二个属性排序 据我所知 如果我设置了排序参数 它会完全覆盖相关性 并按排序参数进行排序 我如何才能首先按相关性对结果进行排序 然后在两个具有完全相同相关性的条目的情况下 对
  • 更有效地检测检查(国际象棋)

    我目前正在开发一个国际象棋引擎 该引擎到目前为止正在运行 但需要很长时间才能生成棋步 由于必须生成许多移动 因此检查检测花费的时间是迄今为止最长的 在尝试了很多事情之后我陷入了困境 并且无法真正弄清楚如何提高效率 我是这样做的 为了检查移动
  • 如何使用图形对象渲染 WPF Hwnd

    之后RenderTargetBitmap就太慢了 我尝试了一种不同的方法 不幸的是我的尝试没有成功 希望你们中的一些人能够弄清楚为什么这段代码不起作用 var myPopup new Popup var child new Grid Bac