1. 程式人生 > 其它 >dotnet 讀 WPF 原始碼筆記 WIC 多媒體圖片處理通過 WindowsCodecs.dll 實現功能

dotnet 讀 WPF 原始碼筆記 WIC 多媒體圖片處理通過 WindowsCodecs.dll 實現功能

技術標籤:WPF原始碼c#WPFdotnetC#WPF

本文是我在讀 WPF 原始碼做的筆記

在 WPF 中,作為一個現代化的 UI 框架,自然有很多多媒體相關的事情需要處理,在 WPF 中有特別的一層是 WIC 層,這一層將包攬了大部分的多媒體圖片的處理。如咱熟悉的 BitmapEncoder 類,裡面就有大量呼叫到 WIC 的邏輯

那麼在 WPF 中說的 WIC 層是什麼?通過 官方文件 可以瞭解到 WIC 就是 Windows Imaging Component 的縮寫,專門用來處理圖片相關的邏輯

在使用者端的程式碼邏輯放在 WindowsCodecs.dll 檔案裡面,這個檔案是跟隨系統的,由系統帶出去的。聽到這句話,是不是有很多小夥計覺得這又是坑呢?被系統帶出去的,意味著依然還會有一些有趣的系統瞎改這個檔案。這也就是在即使使用 dotnet core 版本的 WPF 也許會遇到有多媒體圖片渲染失敗的一個原因了,當然了我這麼久也沒有聽到有小夥伴和我反饋遇到此問題

在 WPF 裡面使用到 WIC 的底層呼叫的邏輯,可以通過在 src\Microsoft.DotNet.Wpf\src\Shared\RefAssemblyAttrs.cs 的 DllImport 程式碼裡面,使用 Resharper 找到 WindowsCodecs 的所有引用,來了解這部分的呼叫

    internal static class DllImport
    {
        internal const string PresentationNative = "PresentationNative" + BuildInfo.WCP_VERSION_SUFFIX + ".dll";
        internal const string PresentationCFFRasterizerNative = "PresentationCFFRasterizerNative" + BuildInfo.WCP_VERSION_SUFFIX + ".dll";
        internal const string MilCore = "wpfgfx" + BuildInfo.WCP_VERSION_SUFFIX + ".dll";

        // DLL's w/o version suffix
        internal const string UIAutomationCore = "UIAutomationCore.dll";
        internal const string Wininet = "Wininet.dll";
        internal const string WindowsCodecs = "WindowsCodecs.dll";
        internal const string WindowsCodecsExt = "WindowsCodecsExt.dll";
        internal const string Mscms = "mscms.dll";
        internal const string PrntvPt = "prntvpt.dll";
        internal const string Ole32 = "ole32.dll";
        internal const string User32 = "user32.dll";
        internal const string NInput = "ninput.dll";
        internal const string ApiSetWinRT = "api-ms-win-core-winrt-l1-1-0.dll";
        internal const string ApiSetWinRTString = "api-ms-win-core-winrt-string-l1-1-0.dll";
    }

按照這個邏輯來說,即使 WPF 層啥都不做,隨著系統版本的更新,在 WIC 層的效能提升也會讓整個 WPF 的多媒體圖片渲染和解碼的效能有所提升,但是我考古了一會沒有發現權威的文件,還請大法們幫忙找找

當前的 WPF 在 https://github.com/dotnet/wpf 完全開源,使用友好的 MIT 協議,意味著允許任何人任何組織和企業任意處置,包括使用,複製,修改,合併,發表,分發,再授權,或者銷售。在倉庫裡面包含了完全的構建邏輯,只需要本地的網路足夠好(因為需要下載一堆構建工具),即可進行本地構建

我搭建了自己的部落格 https://blog.lindexi.com/ 歡迎大家訪問,裡面有很多新的部落格。只有在我看到部落格寫成熟之後才會放在csdn或部落格園,但是一旦釋出了就不再更新

如果在部落格看到有任何不懂的,歡迎交流,我搭建了 dotnet 職業技術學院 歡迎大家加入

如有不方便在部落格評論的問題,可以加我 QQ 2844808902 交流

知識共享許可協議
本作品採用知識共享署名-非商業性使用-相同方式共享 4.0 國際許可協議進行許可。歡迎轉載、使用、重新發布,但務必保留文章署名林德熙(包含連結:http://blog.csdn.net/lindexi_gd ),不得用於商業目的,基於本文修改後的作品務必以相同的許可釋出。如有任何疑問,請與我聯絡。