C# 图像转换实战:Bitmap 转 BitmapSource 的 2 种方法

C# 图像转换实战:Bitmap 转 BitmapSource 的 2 种方法

  • 引言
  • 两种转换方法的完整实现
    • 1. 基于GDI句柄的直接转换 (ToBitmapSourceFast)
    • 2. 基于内存流的编码转换 (ToBitmapSourceSafe)
  • 方法对比与选型指南
  • 避坑指南
    • GDI句柄泄漏问题
    • 图像显示不完整
    • 多线程访问图像引发异常
  • 不同场景的最佳实践
    • UI 实时渲染场景(如视频播放器)
    • 后台批量处理场景
    • 混合策略
  • 总结与决策

C# 图像转换实战:Bitmap 转 BitmapSource 的 2 种方法

引言

在 C# 开发中,当你同时使用 Windows Forms 和 WPF 框架时,是否曾遇到过这样的窘境:

  • “明明都是表示图像的数据类型,为什么 System.Drawing.Bitmap 不能直接赋值给 WPF 的 Image 控件?”
  • “转换图像后程序内存占用飙升,甚至出现莫名其妙的 GDI + 错误?”

这两个问题的根源在于:System.Drawing.Bitmap 属于GDI+(Windows Forms),而 BitmapSource 是WPF核心类型,两者基于不同渲染引擎,无法直接赋值。下面是适用于不同场景下的两种高效转换的方案,解决混合编程中的图像类型转换难题

两种转换方法的完整实现

1. 基于GDI句柄的直接转换 (ToBitmapSourceFast)

[DllImport("gdi32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool DeleteObject(IntPtr hObject);
public static BitmapSource ToBitmapSourceFast(this Bitmap bitmap)
{if (bitmap == null)  return null;IntPtr hBitmap = IntPtr.Zero;try{hBitmap = bitmap.GetHbitmap();   // 获取GDI句柄(非托管资源)return Imaging.CreateBitmapSourceFromHBitmap(hBitmap,IntPtr.Zero,System.Windows.Int32Rect.Empty,BitmapSizeOptions.FromEmptyOptions());   // 直接从GDI句柄创建BitmapSource}catch (Exception ex){Console

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

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

相关文章

Spring Boot 整合 Spring MVC:自动配置与扩展实践

Spring MVC 作为 Java Web 开发的核心框架,在传统 SSM 项目中需要大量 XML 配置(如 DispatcherServlet、视图解析器等)。而 Spring Boot 通过 "自动配置" 特性,简化了 Spring MVC 的整合过程,同时保留了灵活…

print(“\033[31m红\033[32m绿\033[34m蓝\033[0m默认色“)

可以让python的终端字体有着不一样的颜色。代码:print("\033[31m红\033[32m绿\033[34m蓝\033[0m默认色")效果:

LNMP-zblog分布式部署

一、准备3台主机(rocky8)下载相应服务[rootnginx ~]# yum install -y nginx nfs-utils[rootphp ~]# yum install -y nfs-utils php-mysqlnd php php-fpm[rootmysql ~]# yum install -y mysql-server二、挂载php端[rootphp ~]# vim /etc/exports [rootphp…

常见代码八股

1. 利用梯度下降法,计算二次函数yx^2x4的最小值 def target_function(x):return x ** 2 x 4def gradient(x):return 2*x 1x_init 10 x x_init steps 100 lr 0.1 for i in range(100):x x - lr*gradient(x)print(f"最小值 f(x) {target_function(x):.4f…

【深入底层】C++开发简历4+4技能描述6

简历书写 熟悉C的封装、继承、多态,STL常用容器,熟悉C11的Lambda表达式、智能指针等,熟悉C20协程语法,具有良好的编码习惯与文档能力。 回答思路 这里是基本上就是要全会,考察的问题也很固定,stl这块可以定…

forest远程调用注意事项

1、如果在项目中,同时依赖了其中多个框架,那么按 Fastjson2 > Fastjson > Jackson > Gson 这样的优先级来判断,Forest 会以优先级最高的框架作为 JSON 转换器。2、Forest 支持哪几种 JSON 框架?A: 支持 Jackson、Gson、F…

网络资源模板--基于Android Studio 实现的新闻App

目录 一、测试环境说明 二、项目简介 三、项目演示 四、部设计详情(部分) 登录页 首页 五、项目源码 一、测试环境说明 电脑环境 Windows 11 编写语言 JAVA 开发软件 Android Studio (2020) 开发软件只要大于等于测试版本即可(近几年官网直接下载也可…

通过Location API精准获取位置信息并优化定位精度!

👋 你好,欢迎来到我的博客!我是【菜鸟不学编程】    我是一个正在奋斗中的职场码农,步入职场多年,正在从“小码农”慢慢成长为有深度、有思考的技术人。在这条不断进阶的路上,我决定记录下自己的学习与成…

构建可扩展的状态系统:基于 ArkTS 的模块化状态管理设计与实现

摘要 在 HarmonyOS 的日常开发中,很多人都会遇到一个问题:多个页面之间的数据状态如何共享?尤其是在组件结构越来越复杂的场景下,如果还用传统方式来传值,不仅代码混乱,维护也很吃力。 为了解决这个问题&am…

重生之我在暑假学习微服务第二天《MybatisPlus-下篇》

本系列参考黑马程序员微服务课程,有兴趣的可以去查看相关视频,本系列内容采用渐进式方式讲解微服务核心概念与实践方法,每日更新确保知识点的连贯性。通过系统化学习路径帮助开发者掌握分布式系统构建的关键技术。读者可通过平台订阅功能获取…

系统整理Python的条件语句和常用方法

Python 的条件语句(if 语句)是控制程序流程的基础之一,结构清晰、语法简洁,非常适合初学者掌握。一、基本语法结构if 条件:执行代码块1 elif 条件2:执行代码块2 else:执行代码块3示例:score 85if score > 90:print…

记录个IAR程序下载后硬件复位不运行,必须断电复位才运行的问题

【问题测试】有个F407的跑马灯的例子,是MDK和IAR两个版本,MDK版本的例子下载并复位后可以正常看到LED闪烁,而IAR的例子下进去后,不会闪烁。使用TOOL的上位机内核寄存器监测工具测试发现,硬件复位后竟然还在调试状态&am…

观察者模式(Observer Pattern)和 发布-订阅模式(Publisher-Subscriber Pattern)

你对 观察者模式(Observer Pattern)和 发布-订阅模式(Publisher-Subscriber Pattern)的描述是非常准确的,并且阐明了它们的核心区别。为了帮助你更好地理解这两者的细微差异,下面是一个更详细的对比分析&am…

2025年接口技术的十字路口:当MCP遇见REST、GraphQL与gRPC

在当今这个由数据驱动、万物互联的时代,应用程序接口(API)已成为现代软件架构的基石。它们是不同服务之间沟通的桥梁,支撑着从网页应用到复杂的微服务生态系统的一切。长久以来,开发者们在REST、GraphQL和gRPC这几种主…

【CTF-WEB-反序列化】利用__toString魔术方法读取flag.php

题目 页面提示输入?code,那我们在网址里get一下出现了新页面的提示,进入看看下面有个help.php页面的提示,进入看看有一段php代码,仔细分析,应该是要用反序列法代码如下 class FileClass{ public $filename error.log…

在 github.com 与 sourceforge.net 上创建免费个人静态网站、博客的区别

github.com github 属于 git 版本管理专业网站,有免费和收费两种套餐。git 的数据是存放在数据库中的,要将数据库中的数据显示为网站的网页,这需要服务器端提供专门的中间件支持才能实现。 特点: 官方支持:提供长期…

jenkins 入门指南:从安装到启动的完整教程

jenkins 入门指南:从安装到启动的完整教程 持续集成(CI)是现代开发流程中的核心环节,而 Jenkins 作为一款开源的 CI 工具,凭借简单安装、开箱即用、插件丰富、易于扩展等优势,成为开发者的首选工具。它能自…

机器学习(重学版)基础篇(概念与评估)

本篇参考周志华老师的西瓜书,但是本人学识有限仅能理解皮毛,如有错误诚请读友评论区指正,万分感谢。一、基础概念与评估方法本节目标:建立理论基础框架​1、机器学习定义机器学习是一门通过计算手段利用经验(以数据形式…

spring/springboot SPI(二)配合使用的接口

spring.factories 里,Spring 会根据接口来加载实现类,常见的几个接口包括:一、org.springframework.context.ApplicationListener1、作用监听 Spring 容器事件,如 ApplicationReadyEvent。2、使用方法项目结构Spring Boot 2.xSpri…

基于Zig语言,opencv相关的c++程序静态交叉编译

一、写在前面 1.什么是zig? Zig 是一种通用编程语言; Zig 最初的定位就是代替C语言的系统级语言,它提供了与 C 语言几乎 100% 兼容(可直接调用 C 头文件、链接 C 库),同时不需要任何依赖构建系统。 Zig 同时附带一…