笔记:将WPF中可视化元素(Visual)保存为图像,如PNG,JPEG或BMP的方法简介

news2024/9/21 16:49:41

一、目的:将WPF中可视化元素(Visual)保存为图像,如PNG,JPEG或BMP的方法简介

        BitmapEncoder 是 WPF 中用于将图像数据编码为特定格式的基类。它提供了将 BitmapSource 对象保存为各种图像格式(如 PNG、JPEG、BMP 等)的功能。PngBitmapEncoder 是 BitmapEncoder 的一个具体实现,用于将图像数据编码为 PNG 格式。

        PngBitmapEncoder 是 WPF 中用于将图像数据编码为 PNG 格式的类。它属于 System.Windows.Media.Imaging 命名空间。使用 PngBitmapEncoder 可以将 BitmapSource 对象保存为 PNG 文件。

        要将图像保存为其他格式,如 JPEG 或 BMP,你可以使用 JpegBitmapEncoderBmpBitmapEncoder 类。这些类与 PngBitmapEncoder 类似,都是 BitmapEncoder 的具体实现。以下是如何将图像保存为 JPEG 和 BMP 格式的示例。


二、实现

步骤:

1、将 Visual 渲染到 RenderTargetBitmap  中

2、应用BmpBitmapEncoder 保存为对应的文件

示例代码

            int width = 200;
            int height = 200;
            // 使用 DrawingVisual 和 DrawingContext 绘制图形
            DrawingVisual drawingVisual = new DrawingVisual();
            using (DrawingContext drawingContext = drawingVisual.RenderOpen())
            {
                drawingContext.DrawRectangle(Brushes.Blue, null, new Rect(50, 50, 100, 100));
                drawingContext.DrawText(
                    new FormattedText(
                        "Hello, WPF!",
                        System.Globalization.CultureInfo.InvariantCulture,
                        FlowDirection.LeftToRight,
                        new Typeface("Verdana"),
                        32,
                        Brushes.White),
                    new Point(60, 60));

                drawingContext.DrawDrawing(new GeometryDrawing(Brushes.Red, new Pen(Brushes.Black, 1), new RectangleGeometry(new Rect(10, 10, 50, 50))));
            }

            // 将 DrawingVisual 渲染到 RenderTargetBitmap  中
            RenderTargetBitmap renderTargetBitmap = new RenderTargetBitmap(width, height, 96, 96, PixelFormats.Pbgra32);
            renderTargetBitmap.Render(drawingVisual);

            // 保存为 PNG 文件
            SaveAsPng(renderTargetBitmap, "output.png");

            // 保存为 JPEG 文件
            SaveAsJpeg(renderTargetBitmap, "output.jpg");

            // 保存为 BMP 文件
            SaveAsBmp(renderTargetBitmap, "output.bmp");
将图像保存为 PNG 格式
        public void SaveAsPng(RenderTargetBitmap renderTargetBitmap, string filePath)
        {
            PngBitmapEncoder encoder = new PngBitmapEncoder();
            encoder.Frames.Add(BitmapFrame.Create(renderTargetBitmap));
            using (var stream = new System.IO.FileStream(filePath, System.IO.FileMode.Create))
            {
                encoder.Save(stream);
            }
        }
png文件结果 

 

将图像保存为 JPEG 格式
        public void SaveAsJpeg(RenderTargetBitmap renderTargetBitmap, string filePath)
        {
            JpegBitmapEncoder encoder = new JpegBitmapEncoder();
            encoder.Frames.Add(BitmapFrame.Create(renderTargetBitmap));
            using (var stream = new System.IO.FileStream(filePath, System.IO.FileMode.Create))
            {
                encoder.Save(stream);
            }
        }
jpg文件结果  

 

将图像保存为 BMP 格式 

        public void SaveAsBmp(RenderTargetBitmap renderTargetBitmap, string filePath)
        {
            BmpBitmapEncoder encoder = new BmpBitmapEncoder();
            encoder.Frames.Add(BitmapFrame.Create(renderTargetBitmap));
            using (var stream = new System.IO.FileStream(filePath, System.IO.FileMode.Create))
            {
                encoder.Save(stream);
            }
        }
bmp文件结果  

 

 

需要了解的知识点 

BitmapEncoder Class (System.Windows.Media.Imaging) | Microsoft Learn 

PngBitmapEncoder 类 (System.Windows.Media.Imaging) | Microsoft Learn 

JpegBitmapEncoder Class (System.Windows.Media.Imaging) | Microsoft Learn 

BmpBitmapEncoder Class (System.Windows.Media.Imaging) | Microsoft Learn 

RenderTargetBitmap 类 (System.Windows.Media.Imaging) | Microsoft Learn 

DrawingVisual Class (System.Windows.Media) | Microsoft Learn 

System.Windows.Controls 命名空间 | Microsoft Learn

控件库 - WPF .NET Framework | Microsoft Learn

WPF 介绍 | Microsoft Learn

XAML概述 - WPF .NET | Microsoft Learn

Windows Presentation Foundation 简介 - WPF .NET | Microsoft Learn

使用 Visual Studio 创建新应用教程 - WPF .NET | Microsoft Learn

源码地址

GitHub - HeBianGu/WPF-ControlDemo: 示例

GitHub - HeBianGu/WPF-ControlBase: Wpf封装的自定义控件资源库

GitHub - HeBianGu/WPF-Control: WPF轻量控件和皮肤库

了解更多

适用于 .NET 8 的 WPF 的新增功能 - WPF .NET | Microsoft Learn

适用于 .NET 7 的 WPF 的新增功能 - WPF .NET | Microsoft Learn

System.Windows.Controls 命名空间 | Microsoft Learn

Reference Source

Sysinternals - Sysinternals | Microsoft Learn

Windows app development documentation - Windows apps | Microsoft Learn

欢迎使用 Expression Blend | Microsoft Learn

https://learn.microsoft.com/zh-cn/dotnet/desktop/wpf/?view=netdesktop-7.0&WT.mc_id=MVP_380318

https://github.com/HeBianGu

HeBianGu的个人空间-HeBianGu个人主页-哔哩哔哩视频

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2152832.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android 空气质量刻度

效果 attrs.xml <attr name"textSpace" format"dimension|reference" /><attr name"barSpace" format"dimension|reference" /><attr name"scaleHeight" format"dimension|reference" /><at…

armbian debian 系统安装overlayroot后无法启用

千盼万盼 终于debian12可以用了 它终于也跟ubuntu 系统一样可以安装overlayroot了 但是 满怀欣喜的装完了发现 压根没法启动 这。。。。。 原因吗 也简单。。。 默认的映像里没有busybox......... 而它有这个要求。。。 overlayroot 包中有一个小错误&#xff1a;它要求 gr…

微服务远程调用(nacos及OpenFeign简单使用)

问题&#xff1a;在微服务中&#xff0c;每个项目是隔离开的&#xff0c;当有一个项目请求其他项目中的数据时&#xff0c;必须发起网络请求&#xff0c;本文即对此问题展开讨论。 1.使用restTemplate发送请求 //发送请求ResponseEntity<List<ItemDTO>> response …

影刀RPA实战:网页爬虫之药品数据

1 实战目标 这次给大家带来的实战示例是采集中国医药信息平台上的药品数据&#xff0c;主要获取药品名称&#xff0c;介绍&#xff0c;药品类型&#xff0c;处方类型&#xff0c;医保类型&#xff0c;参考价格&#xff0c;药品成分&#xff0c;性状&#xff0c;适应病症&#…

Qt断点调试

Qt断点操作与调试窗口介绍_哔哩哔哩_bilibili 下图来自上面的视频&#xff01;&#xff01;&#xff01; 1.断点调试常用的快捷键 ShiftF11&#xff1a;单步退出所在的那个函数&#xff0c;进行下一步 2.查看函数的调用情况 3.监视变量的值&#xff08;当前断点时的变量值&am…

《操作系统 - 清华大学》第 0 章:操作系统概述 —— 内容概述

介绍一下有关操作系统的一个基本的一个概述&#xff1a; 比如说什么是操作系统&#xff1f;为什么要学习操作系统&#xff0c;以及如何学好操作系统&#xff1f;然后接下来会介绍一下&#xff0c;当前操作系统一些实例以及操作系统的历史&#xff0c;它的演变的一个过程。最后…

wsl2桥接网络 ubuntu到弃坑到又跳坑

搜索Hyper-V image.png 如下图进入虚拟交换机管理器 image.png image.png C:\Users\Administrator下存放 ; 这是 WSL 2 的配置文件 [wsl2] processors4 ; 设置 WSL 2 可以使用的最大 CPU 核心数为 4&#xff0c;自行修改 memory4GB …

使用 KMeans 聚类算法 对鸢尾花数据集进行无监督学习的简单示例

代码功能 主要功能&#xff1a; 加载数据集&#xff1a; 代码使用 load_iris() 函数加载了鸢尾花数据集&#xff08;Iris dataset&#xff09;。这个数据集包含 150 条样本&#xff0c;每条样本有 4 个特征&#xff0c;对应于 3 种不同的鸢尾花。 KMeans 聚类&#xff1a; 使用…

Flowable基础篇

Flowable基础篇 课程环境说明&#xff1a; JDK8Flowable6.7.2MySQL8 一、基础知识科普 1.工作流发展 BPM(BusinessProcessManagement)&#xff0c;业务流程管理是一种管理原则&#xff0c;通常也可以代指BPMS(BusinessProcessManagementSuite)&#xff0c;是一个实现整合不同…

JAVA毕业设计178—基于Java+Springboot+vue的智能家具管理系统(源代码+数据库+万字论文)

毕设所有选题&#xff1a; https://blog.csdn.net/2303_76227485/article/details/131104075 基于JavaSpringbootvue的智能家具管理系统(源代码数据库万字论文)178 一、系统介绍 本项目前后端分离(可以改为ssm版本)&#xff0c;分为用户、管理员两种角色 1、用户&#xff1…

从HarmonyOS升级到HarmonyOS NEXT-环信SDK数据迁移

2024年6月21日 HarmonyOS NEXT &#xff08;后续称之为 NEXT&#xff09; 正式发布&#xff0c;随着 NEXT 稳定版的逐渐临近&#xff0c;各个应用及SDK正在忙于适配 NEXT 系统&#xff0c;同样也面临着系统升级时如何对数据的迁移适配。本文通过使用环信 SDK 介绍如何从 Harmon…

计算机毕业设计推荐-基于python大数据的个性化图书数据可视化分析

&#x1f496;&#x1f525;作者主页&#xff1a;毕设木哥 精彩专栏推荐订阅&#xff1a;在 下方专栏&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; 实战项目 文章目录 实战项目 一、个性化图书数据可视化分析-项…

带你0到1之QT编程:十四、QV/HBoxLayout和QStatckedWidget双剑合璧

此为QT编程的第十四谈&#xff01;关注我&#xff0c;带你快速学习QT编程的学习路线&#xff01; 每一篇的技术点都是很很重要&#xff01;很重要&#xff01;很重要&#xff01;但不冗余&#xff01; 我们通常采取总-分-总和生活化的讲解方式来阐述一个知识点&#xff01; …

【我的 PWN 学习手札】tcache extend

目录 前言 一、利用手法 二、流程演示 &#xff08;1&#xff09;三块物理相邻的堆块 &#xff08;2&#xff09;溢出修改 size &#xff08;3&#xff09;释放该 chunk &#xff08;4&#xff09;重新申请该 chunk &#xff08;5&#xff09;释放第三块 chunk&#x…

算法-Init

&#xff08;1&#xff09;有限性&#xff08;Finiteness&#xff09;&#xff1a;算法必 需在有限步骤内结束&#xff1b; &#xff08;2&#xff09;确定性&#xff08;Definiteness&#xff09;&#xff1a;算法的每一个步骤必须清晰无歧义地定义&#xff1b; &#xff08;3…

科研入门学习

学习视频链接 为什么要读论文 读哪些论文 论文的分类 论文质量 如何找论文 根据领域大牛的名字进行搜索查看高水平论文引用的论文&#xff0c;高水平论文引用的论文很大程度也是高水平的论文 如何整理论文 如何读论文 读论文的困境 不同人群阅读差异 读论文的方式 论文的结构…

叉车限速器外接LED屏,监督厂区安全,让速度慢下来!

叉车限速器外接LED屏&#xff0c;可实时显示当前叉车行驶中的速度&#xff0c;单/双面电子显示屏供用户选择&#xff0c;方便企业人员监控司机当前行驶速度&#xff0c;当速度超过指定值时&#xff0c;叉车速度报警系统发出声光警示&#xff0c;提醒行人、司机&#xff0c;超速…

【ArcGIS微课1000例】0121:面状数据共享边的修改方法

文章目录 一、共享边概述二、快速的修改办法1. 整形共享边2. 修改边3. 概化边缘一、共享边概述 面状数据共享边指的是两个或多个面状数据(如多边形)共同拥有的边界。在地理信息系统(GIS)、三维建模、大数据分析等领域,面状数据共享边是描述面状空间数据拓扑关系的重要组成…

C / C++的内存管理

前言 Hello&#xff0c;我又回来了&#xff0c;今天我们将继续学习C部分&#xff0c;今天我们将承接前面的知识&#xff0c;继续学习C的内存管理&#xff0c;今天的内容较为重要&#xff0c;所以我们废话不多说&#xff0c;我们还是按例三连上车&#xff0c;开始我们今天内容&…

【图灵完备 Turing Complete】游戏经验攻略分享 Part.4 处理器架构

比较有难度的一个部分。 运算单元ALU&#xff0c;其实就是通过OP选择计算方式&#xff0c;然后选通某个计算&#xff0c;之后输出。每个计算逐个实现就行了。 下面是一个优化占地面积的ALU&#xff0c;变得紧凑了一点。 下面是一个简单的OP选通原理线路。判断是立即数寻址&…