WPF顯示動態(tài)GIF技巧分享
WPF開發(fā)工具能夠幫助我們實現(xiàn)許多基于圖形界面顯示的相關(guān)功能。在這里我們就先來了解一下有關(guān)WPF顯示動態(tài)GIF的一些方法。#t#
在我們尋求幫助的時候,最不愿意聽到的答復(fù)是:很抱歉,在當(dāng)前版本的產(chǎn)品中還沒有實現(xiàn)該功能... 在WPF中顯示動態(tài)的GIF圖像時便遇到了這樣的問題,WPF中強大的Image控件卻不支持動態(tài)的GIF(其只能顯示***幀).當(dāng)然,我們可以說WPF 強大的動畫能力,讓我們完全有理由拋棄傳統(tǒng)的GIF動畫,但如某種情況下如果你覺得使用動態(tài)的GIF更合適的話(比如QQ表情,因為GIF是利于保存和傳輸?shù)?,沒關(guān)系,本篇隨筆將幫助你解決這個問題.
1,曾有過的嘗試:
我們在實際開發(fā)過程中也遇到WPF顯示動態(tài)GIF的問題.發(fā)現(xiàn)普通的Image控件不能正常顯示后,我們又發(fā)現(xiàn)網(wǎng)頁瀏覽器卻是可以的,以及 windows XP的"圖片和傳真查看器"也可以,但"Window Live照片庫"卻不可以.所以我們最初打算使用通過包裝WebBrowseControl來實現(xiàn),即是在WPF中host一個.net2.0中的瀏覽器控件,然后讓該瀏覽器來實現(xiàn)圖片,成功了,但麻煩的事情是鼠標(biāo)右鍵可以點出網(wǎng)頁的上下文菜單.
我們放棄了該方案,除了不愿意花時間來屏蔽上下文菜單和瀏覽器控件的多余功能外,同時我們的覺得瀏覽器控件過于"重量級",有點殺雞用牛刀的感覺.另外,你可能會想到使用WPF中的Frame控件,但也會得到上述結(jié)果.另外,有網(wǎng)友說可以使用MediaElement控件,但大都沒有成功,我也沒有(可能是RP不夠哈,呵呵...)
2,GifBitmapDecoder
我們發(fā)現(xiàn)WPF中有一個名為GifBitmapDecoder的類,其可以將WPF顯示動態(tài)GIF分解成很多幀并保存在一個列表中,每一幀為一個BitmapFrame類型的對象,其父類為BitmapSource,這也就意味著,我們可以將每一幀賦值給一個Image控件的Source屬性,這樣我們可以得到針對GIF各幀的Image系列:
- GifBitmapDecoder decoder =
new GifBitmapDecoder( new Uri
("OH.gif",UriKind.Relative),
BitmapCreateOptions.PreservePixel
Format,BitmapCacheOption.Default);- foreach (BitmapFrame f in
decoder.Frames)- {
- Image image = new Image();
image.Source = f;- this.panel1.Children.Add(image);
- }
3,解析GIF
要解析文件就必須知道文件的存儲結(jié)構(gòu),比如,得到幀的顯示時間的方法是這樣的:
- private
- int ParseGraphicControlExtension
(byte[] gifData, int offset)- {
- int returnOffset = offset;
- // Extension Block
- int length = gifData[offset + 2];
- returnOffset = offset + length + 2 + 1;
- byte packedField = gifData[offset + 3];
currentParseGifFrame.disposalMethod =
(packedField & 0x1C) >> 2;- // Get DelayTime
- int delay = BitConverter.ToUInt16
(gifData, offset + 4);- currentParseGifFrame.delayTime = delay;
- while (gifData[returnOffset] != 0x00)
{ returnOffsetreturnOffset =
returnOffset + gifData[returnOffset] + 1;- } returnOffset++;
- return returnOffset;
- }
以上就是對WPF顯示動態(tài)GIF的相關(guān)方法的介紹。