Silverlight支援兩個格式的圖檔顯示,它們是:JPEG和PNG,PNG使用的是無損壓縮算法,可以準确重建原始位圖;而JPEG使用的是一種有損壓縮算法,這種算法會對齊人們肉眼不易察覺到的一些可視資訊這種壓縮方式對照片這樣的圖像非常有效,但是卻不适用于文本或基于矢量派生的位圖,如建築圖和動畫。
1.Image元素
在Silveright中,Image元素用來顯示位圖,但是Image元素并不是位圖本身。
下面是Image元素顯示本地圖檔的xaml代碼:
<Image Name="image1" Source="Images/Superman.jpg"/> //當中的Source屬性指向要顯示的圖檔
預設的情況,在保持正确的寬高比例的前提之下,Image元素會盡量放大或縮小以充滿其容器(内容網格)。如果想要按原始像素尺寸顯示圖檔的話,可以将Image的Stretch屬性設定為None:
<Image Name="image1" Source="Images/Superman.jpg" Stretch="None" />
Image可以通過Web來擷取圖像,隻需要将Image的Source屬性設定為一個可用的URL即可,如下面的示例所示:
<Image Name="image1" Source="http://images.cnblogs.com/cnblogs_com/IPrograming/353645/o_sammy-2-anos.jpg" />
這樣Image元素就可以根據給定的URL從Web中下載下傳圖檔并顯示,這樣就能夠控制可執行檔案的大小,但是考慮到Windows Phone裝置并不總是與Web連接配接,并且在圖檔下載下傳過程中還可能遇到其他的問題。為了處理這種情況,我們可以根據Image元素的兩個事件:ImageFailed(出現錯誤後發生)和ImageOpened(下載下傳成功後發生),根據這兩個事件來判斷下載下傳是否成功,進而使程式根據不同的情況作出相應的選擇。
2.ImageSource
Object
DependencyObject(抽象)
ImageSource(抽象)
BitmapSource(抽象)
BitmapImage
WriteableBitmap
ImageSource是一個抽象類,派生了BitmapSource,BitmapSource類型是另一個抽象類,他定義了一個名為SetSource的方法,該方法可以通過Stream對象加載圖像。派生自BitmapSource的BitmapImage支援一個可接收Uri對象的構造函數,包括一個Uri類型的UriSource屬性。
加載本地位圖并顯示到一個Image元素中:
Uri uri = new Uri("/SilverlightTapToDownload;component/Images/Superman.jpg",UriKind.Relative); //當生成操作為Resource時URL顯得比較複雜,先是以程式名稱開頭,然後分号,接着單詞component,最後是檔案夾和檔案名。如果把圖檔屬性的生成操作(Build Action)改為内容(Content)而不是Resource時,文法可以這樣簡寫:
Uri uri = new Uri("Images/Superman.jpg", UriKind.Relative);
//兩者之間有何不同呢?
//兩種情況下,位圖都存儲在xap檔案中的某一個目錄下。差別在于:
//當Bulid Action為Resource時,位圖與編譯後的程式一同儲存在SilverlightTapToDownload.dll檔案中
//當Build Action為Content時,位圖儲存在SilverlightTapToDownload.dll檔案的外部
StreamResourceInfo resourceInfo = Application.GetResourceStream(uri);
BitmapImage bmp = new BitmapImage();
bmp.SetSource(resourceInfo.Stream);
image1.Source = bmp; //image1是一個Image元素
從網絡上下載下傳一張圖檔并顯示到一個Image元素中:
Uri uri = new Uri("http://images.cnblogs.com/cnblogs_com/IPrograming/353645/o_sammy-2-anos.jpg");
BitmapImage bmp = new BitmapImage(uri);
image1.Source = bmp; //image1是一個Image元素