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
英文地址,請注明出處:http://en.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 同時附帶一…