1. 程式人生 > >[WPF] 嵌入資源到DLL,並解決PNG圖片問題

[WPF] 嵌入資源到DLL,並解決PNG圖片問題

在WPF有很多種資原始檔儲存的方式,就圖片的儲存就麻煩到極點。

最近自己弄一個專案就遇到這樣那樣的問題,現在把自己的使用方法總結出來給大夥借鑑借鑑!

在我的專案中,我並不想把所有的圖片都存放在資料夾下,因為這樣使用者如果圖片檔案沒有拷貝到就悲劇了。

最初我是把圖片資源拖到主程式的資源中,這樣就能主動嵌入進去,不必生成到資料夾中,但是我又發現這樣主程式太大了。

這當然不是我想看到的,所以有了新建一個類庫專案,把圖片資源都壓縮到類庫專案中,然後在主程式中引用!

步驟如下:

1.新建類庫專案

2.新增圖片資源:直接拖動圖片到專案中即可,當然你可以有自己的資料夾

3.編寫主程式訪問類。

4.主程式訪問

簡單來說就是4步;但是這樣你肯定不會,並且在這裡也有兩種方法:

清單:兩個專案,兩個圖片,一個類!

第一種:


第一個圖片屬性:


開啟類庫屬性,資源,把第一個圖片拖動進去!


編寫程式碼:

public static BitmapSource GetBitmapImage_001()
        {
            BitmapSource returnSource;
            try
            {
                //直接獲取資源
                Bitmap bmap = TestResource.Properties.Resources.I_001;
                //轉換格式
                returnSource = Imaging.CreateBitmapSourceFromHBitmap(bmap.GetHbitmap(), IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions());
                bmap.Dispose();
            }
            catch
            {
                returnSource = null;
            }
            return returnSource;
        }


第二種:

設定第二個圖片屬性:嵌入資源


編寫程式碼:

public static BitmapSource GetBitmapImage_002()
        {
            //獲取檔案流
            Assembly myAssembly = Assembly.GetExecutingAssembly();            
            //格式為:專案名稱-資料夾地址-檔名稱
            Stream myStream = myAssembly.GetManifestResourceStream("TestResource.Resource.I_002.png");
            //圖片格式
            BitmapImage image = new BitmapImage();
            image.BeginInit();
            image.StreamSource = myStream;
            image.EndInit();
            myStream.Dispose();
            myStream.Close();
            return image;
        }

比較:

兩種都是各有所長,第一種先設定為內建資源然後引用,第二種,直接讀取流使用!

兩種的方法都可以,第一種由於要從Bitmap轉為BitmapImage所以存在PNG圖片透明度丟失問題。

所以如果針對圖片,第二種要比較好控制一些!

而假如針對音訊等檔案,你會發現第一種比較好,因為第一種對音訊等檔案會預設返回Stream型別,這個可以直接返回給主程式使用!


以上只是個人觀點,如有錯誤,還請指正!

免費奉上原始碼: