[WPF] 嵌入資源到DLL,並解決PNG圖片問題
阿新 • • 發佈:2019-01-28
在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型別,這個可以直接返回給主程式使用!
以上只是個人觀點,如有錯誤,還請指正!
免費奉上原始碼: