如果您想修改該圖形文件,只需要用圖像編輯器從Resources目錄中打開它,修改后進(jìn)行保存即可。每次編譯時(shí)Visual Studio都會(huì)自動(dòng)選擇該文件的最新版本。
將圖形嵌入后,我們需要知道如何通過代碼來讀取它。這是通過Assembly.GetManifest-
ResourceStream函數(shù)來實(shí)現(xiàn)的。我們只需要將包含了圖形文件程序集的路徑作為一個(gè)字符串傳遞給該函數(shù)即可。該路徑包含了幾個(gè)元素,元素之間用句點(diǎn)分隔:
● 程序集的名稱;
● Solution Explorer窗口中包含了資源文件的目錄的名稱(子目錄用句點(diǎn)來分隔,而不是DOS路徑格式中的反斜杠)。這個(gè)元素只有在需要時(shí)才出現(xiàn);
● 資源文件的文件名。
所有這些元素都是區(qū)分大小寫的。
可以用下面的代碼來編程檢索程序集的名稱:
String AssemblyName = Assembly.GetExecutingAssembly().GetName().Name;
通過代碼來查找程序集的名稱意味著,當(dāng)您決定修改程序集的名稱后,代碼仍然可以繼續(xù)正常工作。因此我推薦您使用這種方法。一旦使用了這個(gè)方法,我們會(huì)將重點(diǎn)放到目錄及文件名上,這樣才能得到完整的資源名稱。然后將資源名稱傳遞到GetManifestResourceStream函數(shù)中,就能以Stream的方式獲得圖形資源,Bitmap對(duì)象的一個(gè)構(gòu)造函數(shù)能夠識(shí)別Stream對(duì)象。將所有這些操作組合到一起,我們就得到程序清單3-9。
程序清單3-9 從一個(gè)嵌入資源中載入位圖圖像
// Declare the Bitmap object that we are going to create
Bitmap myBitmap;
private void InitializeBitmap()
{
// Get the assembly name
String AssemblyName = Assembly.GetExecutingAssembly().GetName().Name;
// Add the resource path and name
String ResourceName = AssemblyName + ".Resources.Rocket.png";
// Generate the resource bitmap -- this will contain our spaceship image
using (System.IO.Stream str =
Assembly.GetExecutingAssembly().GetManifestResourceStream
(Resor-uceName))
{
myBitmap = new Bitmap(str);
}
}
如果指定的資源名稱不正確,則GetManifestResourceStream函數(shù)也不會(huì)拋出異常,而是返回null。當(dāng)您在實(shí)例化一個(gè)Bitmap對(duì)象時(shí)如果碰到一個(gè)NullReferenceException異常,那么最大的可能就是由于資源名稱不正確所造成的。為了能夠?qū)@種情形做出有用的響應(yīng),最好是將該操作放在一個(gè)try/catch代碼塊中。這樣在捕獲了一個(gè)NullReferenceException異常后,您可以提供一條更加有用的錯(cuò)誤消息。以后當(dāng)您不知道項(xiàng)目為何不啟動(dòng)時(shí)這樣做能減少很多令人頭疼的問題。
2. 從文件中讀取圖形
在一些情況下,您還是會(huì)希望將圖形存放在單獨(dú)的文件中。例如,允許用戶選擇文件夾來存放不同的圖形,或者允許用戶提供自己的圖形。要將圖像從一個(gè)文件加載到一個(gè)Bitmap對(duì)象中,只需要在實(shí)例化對(duì)象時(shí)提供該文件的文件名即可:
myBitmap = new Bitmap("Graphics.png");
如果指定的圖像文件不存在,那么系統(tǒng)會(huì)拋出一個(gè)FileNotFoundException異常。
3. 關(guān)于圖形文件格式的一個(gè)注意事項(xiàng)
在對(duì)用于游戲中的圖形文件進(jìn)行保存時(shí),可以對(duì)圖形文件的格式進(jìn)行選擇。有些格式明顯要比其他格式好,下面對(duì)它們做個(gè)總結(jié):
● BMP(Bitmap,位圖)文件使用了一個(gè)簡(jiǎn)單的內(nèi)部結(jié)構(gòu),因此用圖形庫可以非常容易地與它進(jìn)行交互。其原因之一是該格式?jīng)]有應(yīng)用任何壓縮。所以,BMP文件的體積可能會(huì)比其他圖形格式文件大很多。沒有什么原因需要必須使用BMP文件,所以盡量避免使用它們。
● GIF(Graphics Interchange Format,圖形交換格式)文件已經(jīng)成為了一個(gè)使用很廣泛的圖形格式,而不只是被Web所采用。它可以存儲(chǔ)最多256色的圖片并且對(duì)內(nèi)容進(jìn)行了壓縮以減小文件的大小。它采用了無損壓縮的方式,所以圖片質(zhì)量不會(huì)下降。在GIF文件中可以存儲(chǔ)簡(jiǎn)單的動(dòng)畫,但在.NET CF中該功能會(huì)被忽略,因此沒有為我們提供什么優(yōu)勢(shì)。它是合適的圖形存儲(chǔ)格式,不過在壓縮率方面,PNG文件更為強(qiáng)大。
● PNG(Portable Network Graphics,便捷網(wǎng)絡(luò)圖像)文件是最近才開發(fā)的文件格式,.NET CF支持該文件格式。它可以用24位真彩色來保存圖像,并且還支持alpha(透明度)信息。與GIF文件一樣,它也采用的是無損壓縮,但文件要小于GIF格式的文件。對(duì)于非照片圖像,我推薦采用這種文件格式。
JPG(JPEG的縮寫,Joint Photographic Experts Group開發(fā)了這種格式)文件使Web發(fā)生了變革,并且在很多其他領(lǐng)域也成為成熟的技術(shù),例如數(shù)碼相機(jī)。這個(gè)格式強(qiáng)大的壓縮能力可以使圖像文件比未壓縮時(shí)小很多,遠(yuǎn)遠(yuǎn)超過了GIF和PNG能提供的壓縮率。然而問題在于,JPG使用的是有損壓縮技術(shù):對(duì)圖像進(jìn)行解壓縮后,就不能精確地恢復(fù)成原始圖像。壓縮后的JPG圖像的打開速度快但圖形會(huì)失真,對(duì)于那些包含了高對(duì)比度色彩區(qū)域的圖像來說最為明顯。例如那些在電腦游戲中常常出現(xiàn)的圖片。JPG文件對(duì)減小照片圖像的文件大小很有幫助,但不太適合手繪的游戲圖片。即使對(duì)于照片圖形,要注意不要把圖像壓縮到失真的地步。