在開發Windows Phone應用程式的時候,或多或少會與圖片打交道,下面總結下Windows Phone 中處理圖片的一些技巧
1. 圖片格式.
2. 圖片編譯方式
3. 圖片載入方式
4. 圖片緩衝
5. GIF圖片
6. 圖片大小限制
7. 圖片選取器
1. 圖片格式
我們知道在Windows Phone 中只支援JPG與PNG格式的圖片,藉助ImageTools類庫我們可以在Windows Phone 中使用GIF圖片。在Windows Phone 中推薦優先使用JPG格式的圖片,因為在Windows Phone 中JPG圖片的解碼速度比PNG快,當然比GIF更快。除非是有透明背景的要求使用PNG圖片,否則推薦使用JPG圖片。除非要使用GIF動態圖片,建議少使用ImageTools。
2. 圖片編譯方式
Windows Phone 7中圖片為Resource和Content的區別: 產生方式為Resource的圖片會被編譯到應用程式集(DLL)裡,而產生方式為Content的圖片則會被部署到XAP包中。當你把你的圖片copy到項目中,圖片的產生動作預設是資源(Resource),但我通常選擇Content以擷取更快的速度。我們應該如何選擇圖片的產生方式(Build Action)呢? 每種產生方式都有其用武之地:設定產生方式為Content意味著應用程式可以更快的載入圖片資源;將產生方式設為Resource對你重新部署程式非常有用,這對類庫項目十分合適的。
另外一個小區別是在引用的時候,斜杠(/ & \)的方向:
Content: <Image Source="/ImagesAsContent/smiley1.png"/>
Resource: <Image Source="..\ImagesAsResource\smiley3.png"/>
3. 圖片載入方式
我們可以使用非同步或者同步載入的方式去載入圖片。
設定其UriSource是非同步載入:BitmapImage.UriSource = uriSource;
設定其檔案流是同步載入: BitmapImage.SetSource(stream);
注意非同步載入圖片並不是完全開啟另外一個線程去操作的,因為正在下載的圖片的解碼工作還是發生的主要的UI線程上的。下面是非同步與同步載入的一點總結:
如果你同步載入一個不存在的圖片檔案,你會得到一個異常;
如果你非同步載入一個不存在的圖片檔案,ImageFailed事件被觸發(如果你註冊了這個事件);
如果你同步載入一個存在的圖片檔案,當載入完成時ImageOpened事件被觸發;
如果你非同步載入一個存在的圖片檔案,當載入完成時ImageOpened事件不會被觸發。
4. 圖片緩衝
圖片緩衝是一個很好用的功能,如果使用得當會將你應用程式的效能提高不少,Bitmap緩衝將可視化元素(visual elements)儲存為bitmap在他們第一次被渲染的時候,以後你如果用到這個元素,不會再去渲染他而是使用緩衝的bitmap
5. GIF圖片
關於如果在Windows Phone 中顯示GIF圖片,我專門寫過一篇部落格介紹,如需要大家可以去看看 Windows Phone 實用開發技巧(8):在Windows Phone顯示GIF圖片
6. 圖片大小限制
由於螢幕大小限制,在Windows Phone對圖片的解析度也有一定的限制。MS推薦在Windows Phone 中使用圖片的解析度不要超過2000*2000
Due to the limited screen resolution of Windows Phone, another way to optimize performance is to limit the image size to 2000 x 2000 pixels, which is the size limit of images in Windows Phone environment. Larger images will be sampled at a lower resolution. Also, if you use images that are larger than 2000 x 2000 pixels, they will be significantly slower to appear.
7.圖片選取器
我們的應用中可能需要提供使用者自己選擇的圖片的功能,這時候PhotoChooserTask就有用武之地了,他有一個Completed事件,返回的是選中照片的檔案流,我們可以將流設定到頁面中的圖片控制項中,其常見的用法如下:
這裡有個小技巧跟大家分享下:PhotoChooserTask 可以返回指定像素的圖片,即如果你只想擷取圖片中的部分作為返回,你只需要設定task的PixelHeight與PixelWidth即可。