前面介紹了Windows Phone 解析圖片尺寸之gif,之前也介紹了jpg和png圖片的相關解析。Windows Phone系統支援的圖片格式是jpg和png,所以bmp圖片的現實同gif圖片顯示的處理方式類似,同樣需要採用第三方類庫ImageTools,其中ImageTools的擷取在gif圖片解析中已經介紹,下面代碼給出建立一個顯示bmp圖片的控制項。
View Code
//建立bmp控制項
AnimatedImage bmpImage = new AnimatedImage();
Decoders.AddDecoder<BmpDecoder>();
//根據圖片位元組流載入圖片
ExtendedImage extendedImg = new ExtendedImage();
BmpDecoder dc = new BmpDecoder();
dc.Decode(extendedImg, stream);
bmpImage.Source = extendedImg;
典型的位元影像檔案格式通常包含下面幾個資料區塊:
位元影像頭:儲存位元影像檔案的總體資訊。
位元影像資訊:儲存位元影像映像的詳細資料。
調色盤:儲存所用顏色的定義。
位元影像資料:儲存一個又一個像素的實際映像。
通過解析位元影像頭我們可以判斷圖片是否為bmp格式,而我們所需要的圖片尺寸資訊儲存在位元影像資訊資料區塊裡。所以我們需要詳細瞭解位元影像頭和位元影像資訊兩個資料區塊的儲存結構。
位元影像頭,這部分是識別資訊,典型的應用程式會首先普通讀取這部分資料以確保的確是位元影像檔案並且沒有損壞。
位元組 #0-1 儲存位元影像檔案的標識符,這兩個位元組的典型資料是BM。
位元組 #2-5 使用一個dword儲存位元影像檔案大小。
位元組 #6-9 是保留部分,留做以後的擴充使用,對實際的解碼格式沒有影響。
位元組 #10-13 儲存位元影像資料位元置的地址位移,也就是起始地址。
位元影像資訊,這部分告訴應用程式映像的詳細資料,在螢幕上顯示映像將會使用這些資訊,它從檔案的第15個位元組開始。
位元組 #14-17 定義以下用來描述影像的區塊(BitmapInfoHeader)的大小。它的值是:40 - Windows 3.2、95、NT、12 - OS/2 1.x、240 - OS/2 2.x
位元組 #18-21 儲存位元影像寬度(以像素個數表示)。
位元組 #22-25 儲存位元影像高度(以像素個數表示)。
…………
以上關於bmp檔案結構的內容參考維基百科http://zh.wikipedia.org/wiki/BMP。
通過上面對BMP圖片格式的瞭解,可以用下面的代碼來解析bmp圖片的尺寸大小。
View Code
//Bmp 圖片前2位元組:0x42 4D
byte[] header = new byte[2];
stream.Read(header, 0, 2);
if ( !(header[0] == 0x42 && header[1] == 0x4D))
{
//不是BMP圖片
return;
}
//跳過16個位元組
stream.Seek(16, SeekOrigin.Current);
//bmp圖片的寬度資訊儲存在第 18-21位 4位元組
//bmp圖片的高度度資訊儲存在第 22-25位 4位元組
//讀取寬度,高度 各4位元組
byte[] buffer = new byte[8];
stream.Read(buffer, 0, buffer.Length);
width_ = BitConverter.ToInt32(buffer, 0);
height_ = BitConverter.ToInt32(buffer, 4);