C#下“Bitmap”转换为“BitmapImage”,“Bitmap”转换成“BitmapSource”

在实际开发中时常遇到“Bitmap”转换为“BitmapImage”,“Bitmap”转换成“BitmapSource”格式转化的开发,特此记录。

1、“Bitmap”转换为“BitmapImage”

要将 System.Drawing.Bitmap 转换为 System.Windows.Media.Imaging.BitmapImage,我们可以首先将 Bitmap 保存到内存流中,然后使用该流来初始化一个 BitmapImage。以下是一个封装好的函数,实现了这一转换过程:

步骤 1:添加必要的引用

确保你的项目引用了 PresentationCore、WindowsBase 和 System.Drawing 程序集。PresentationCore 和 WindowsBase 通常在创建WPF应用程序时自动引用,但可能需要手动添加对 System.Drawing 的引用。

步骤 2:转换函数

using System;
using System.Drawing; // 引用 System.Drawing
using System.Drawing.Imaging;
using System.IO;
using System.Windows.Media.Imaging; // 引用 PresentationCorepublic static BitmapImage ConvertBitmapToBitmapImage(System.Drawing.Bitmap bitmap)
{if (bitmap == null)throw new ArgumentNullException(nameof(bitmap));using (MemoryStream memoryStream = new MemoryStream()){// 将 Bitmap 保存到内存流bitmap.Save(memoryStream, ImageFormat.Png);// 重置流的位置memoryStream.Position = 0;// 创建 BitmapImage 并从内存流加载BitmapImage bitmapImage = new BitmapImage();bitmapImage.BeginInit();bitmapImage.CacheOption = BitmapCacheOption.OnLoad; // 设置缓存选项bitmapImage.StreamSource = memoryStream;bitmapImage.EndInit();bitmapImage.Freeze(); // 冻结对象,使其不可修改return bitmapImage;}
}

说明:

  1. 这个方法首先检查传入的 System.Drawing.Bitmap 对象是否为 null。
  2. 使用 MemoryStream 作为临时存储,通过调用 bitmap.Save(memoryStream, ImageFormat.Png) 将 Bitmap 保存到内存流中。这里使用 PNG
    格式是因为它支持透明度,并且是无损的,但你可以根据需要选择其他格式。
  3. 设置内存流的 Position 为 0 是必要的,因为保存图像后,流的当前位置在末尾,直接读取会导致读取不到数据。
  4. 接下来,创建一个 BitmapImage 对象,并通过设置 StreamSource 为我们的内存流来加载图像数据。使用 BeginInit() 和 EndInit() 来开始和结束初始化过程。
  5. 设置 CacheOption 为 BitmapCacheOption.OnLoad 是为了在加载时将图像数据缓存,这样就可以释放内存流而不影响 BitmapImage。
  6. 调用 Freeze() 方法使 BitmapImage 对象不可修改,这是在WPF中处理图像时的最佳实践,特别是当你在非UI线程中操作图像时。

通过上述步骤,你可以将 System.Drawing.Bitmap 对象转换为WPF中使用的 System.Windows.Media.Imaging.BitmapImage 对象,从而在WPF应用程序中显示或进一步处理图像。

2、“Bitmap”转换成“BitmapSource”

在.NET Framework中,System.Drawing.Bitmap和System.Windows.Media.Imaging.BitmapSource是两个不同的图像表示方式。如果你需要将一个System.Drawing.Bitmap转换为System.Windows.Media.Imaging.BitmapSource,你可以使用以下代码实现:

using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Windows;
using System.Windows.Media;
using System.Windows.Media.Imaging;public static BitmapSource ConvertBitmapToBitmapSource(Bitmap bitmap)
{if (bitmap == null)return null;var memoryStream = new MemoryStream();bitmap.Save(memoryStream, ImageFormat.Bmp);memoryStream.Position = 0;var bitmapImage = new BitmapImage();bitmapImage.BeginInit();bitmapImage.StreamSource = memoryStream;bitmapImage.CacheOption = BitmapCacheOption.OnLoad;bitmapImage.EndInit();return bitmapImage;
}

说明

  1. 如果传入的Bitmap对象是null,那么函数会立即返回null。
  2. 首先,我们创建一个MemoryStream对象来存储Bitmap的数据。然后,我们调用Save方法将位图保存到内存流中,格式为bmp。
  3. 然后,我们将内存流的位置设为0,以便从流的开始位置读取数据。
  4. 接下来,我们创建一个新的BitmapImage,并使用BeginInit方法开始初始化过程。我们设置StreamSource属性为前面创建的内存流,并使用BitmapCacheOption.OnLoad选项缓存整个位图。
  5. 最后,我们调用EndInit方法完成初始化,并返回转换后的BitmapSource对象。

这个函数将一个System.Drawing.Bitmap转换为一个System.Windows.Media.Imaging.BitmapSource对象。你可以在需要时将其放入WPF应用程序中。

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

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

相关文章

【服务器】RAID(独立磁盘冗余阵列)

RAID(独立磁盘冗余阵列) 一、RAID的介绍二、RAID的分类#2-1 RAID 02-2 RAID 1#2-3 RAID 32-4 RAID 52-5 RAID 62-6 RAID 10(先做镜像,再做条带化)2-7 RAID 01(先做条带,再做镜像)2-8 RAID比较 三、磁盘阵列…

代码随想录刷题第24天

今天正式进入回溯。看了看文章介绍,回溯并不是很高效的算法,本质上是穷举操作。代码形式较为固定。 第一题为组合问题,用树形结构模拟,利用回溯算法三部曲,确定终止条件与单层逻辑,写出如下代码。 不难发现…

负载均衡下webshell连接

目录 一、什么是负载均衡 分类 负载均衡算法 分类介绍 分类 均衡技术 主要应用 安装docker-compose 2.1上传的文件丢失 2.2 命令执行时的漂移 2.3 大工具投放失败 2.4 内网穿透工具失效 3.一些解决方案 总结 一、什么是负载均衡 负载均衡(Load Balanc…

网络安全挑战:威胁建模的应对策略与实践

在数字威胁不断演变的时代,了解和降低网络安全风险对各种规模的组织都至关重要。威胁建模作为安全领域的一个关键流程,提供了一种识别、评估和应对潜在安全威胁的结构化方法。本文将深入探讨威胁建模的复杂性,探索其机制、方法、实际应用、优…

python爬虫5

1.selenium交互 无页面浏览器速度更快 #配置好的自己不用管 from selenium import webdriverfrom selenium.webdriver.chrome.options import Optionschrome_options Options()chrome_options.add_argument(‐‐headless)chrome_options.add_argument(‐‐disable‐gpu)# path…

109.乐理基础-五线谱-五线谱的附点、休止符、连线、延音线

内容参考于:三分钟音乐社 上一个内容:五线谱的拍号、音符与写法-CSDN博客 上一个内容里练习的答案: 附点:写在符头的右方,附点的作用与简谱一样,延长前面音符本身时值的一半(附点)…

Hadoop3.x基础(3)- Yarn

来源:B站尚硅谷 目录 Yarn资源调度器Yarn基础架构Yarn工作机制作业提交全过程Yarn调度器和调度算法先进先出调度器(FIFO)容量调度器(Capacity Scheduler)公平调度器(Fair Scheduler) Yarn常用命…

回归预测 | Matlab实现POA-CNN-LSTM-Attention鹈鹕算法优化卷积长短期记忆网络注意力多变量回归预测(SE注意力机制)

回归预测 | Matlab实现POA-CNN-LSTM-Attention鹈鹕算法优化卷积长短期记忆网络注意力多变量回归预测(SE注意力机制) 目录 回归预测 | Matlab实现POA-CNN-LSTM-Attention鹈鹕算法优化卷积长短期记忆网络注意力多变量回归预测(SE注意力机制&…

RocketMQ—RocketMQ发送同步、异步、单向、延迟、批量、顺序、批量消息、带标签消息

RocketMQ—RocketMQ发送同步、异步、单向、延迟、批量、顺序、批量消息、带标签消息 发送同步消息 生产者发送消息,mq进行确认,然后返回给生产者状态。这就是同步消息。 前文demo程序就是发送的同步消息。 发送异步消息 异步消息通常用在对响应时间敏…

gorm day1

gorm day1 gorm简介gorm声明模型 代码样例基本来自官方文档 Gorm简介 什么是ORM? 对象关系映射(Objection Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库(如mysql数据库)存在的互不匹配现象的计数。简单来说,ORM是通…

计算机毕设医院挂号预约系统ssm

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: vue mybatis Maven mysql5.7或8.0等等组成,B…

定时删除指定文件夹及子文件夹 确保硬盘不会被占满 bat脚本

如果你想要一个批处理脚本,该脚本可以在定时删除指定文件夹及其子文件夹的同时确保硬盘不会被占满,你可以使用以下脚本: echo off set "target_folderC:\path\to\folder" set "days_to_keep7" set "max_space_to_us…

【Redis】整理

对于现代大型系统而言,缓存是一个绕不开的技术话题,一提到缓存我们很容易想到Redis。 Redis整理,供回顾参考

解释 Python 中的描述符(Descriptor)是什么?如何在 Python 中实现一个简单的 ORM(对象关系映射)?

解释 Python 中的描述符(Descriptor)是什么?举例说明其用法。 在 Python 中,描述符(Descriptor)是一种对象属性的扩展机制,它允许你在访问或修改属性时执行自定义的操作。描述符是实现了特定协…

单片机学习笔记---定时器/计数器(简述版!)

目录 定时器的介绍 定时计数器的定时原理 定时计数器的内部结构 两种控制寄存器 (1)工作方式寄存器TMOD (2)控制寄存器TCON 定时计数器的工作方式 方式0 方式1 方式2 方式3 定时器的配置步骤 第一步,对…

MATLAB算法实战应用案例精讲-【人工智能】基于机器视觉的机器人及机械臂运动规划(最终篇)

目录 前言 几个高频面试题目 机械臂智能抓取涉及什么技术? 算法原理 智能抓取系统构成

《幻兽帕鲁》好玩吗?幻兽帕鲁能在Mac上运行吗?

最近一款叫做《幻兽帕鲁》的新游戏走红,成为了Steam游戏平台上,连续3周的销量冠军,有不少Mac电脑用户,利用Crossover成功玩上了《幻兽帕鲁》,其实Crossover已经支持很多3A游戏,包括《赛博朋克2077》《博德之…

Nicn的刷题日常之字符串左旋(详细图解思路,多解法,建议三连收藏)

目录 1.题目描述 一 2.解题想法图解 2.1直接解 2.2巧解 3.题目描述二 3.1.1思路1 3.1.2 思路2 4.结语 1.题目描述 一 实现现一个函数,可以左旋字符串中的k个字符。 例如: ABCD左旋一个字符得到BCDA ABCD左旋两个字符得到CDAB 2.解题想法图解 2.…

【QT+QGIS跨平台编译】之二十四:【GeoTIFF+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

文章目录 一、GeoTIFF介绍二、文件下载三、文件分析四、pro文件五、编译实践一、GeoTIFF介绍 GeoTIFF是一种常用的地理信息系统(GIS)文件格式,其采用标签结构将栅格地理空间数据以及相关的元数据存储在一个单一的文件中。它是基于标准的TIFF(Tagged Image File Format)格…

使用wda框架实现IOS自动化测试详解

目录 1、weditor元素定位工具 1.1、weditor的安装和使用 2、wda iOS自动化框架 2.1、wda概述 2.2、wda安装 2.3、wda的使用 2.3.1、全局配置 2.3.2、创建客户端 2.3.3、APP相关操作 1、启动APP 2、关闭APP 3、获取APP状态信息 4、获取当前APP的运行信息 2.3.4、设…