已知WPF的Image元素只能顯示GIF圖片的第一幀,而MediaElement不能加載作為資源或內(nèi)嵌的資源的GIF圖片,所以網(wǎng)上有幾種實(shí)現(xiàn)方法。
GifImage
GifImage繼承自FrameworkElement,添加了Source、Stretch、StretchDirection依賴(lài)項(xiàng)屬性,用法就跟標(biāo)準(zhǔn)Image元素差不多。從GIF里分解出各幀及其延續(xù)時(shí)間后,我在OnRender里自行繪制,并啟動(dòng)DispatcherTimer計(jì)時(shí),以便按時(shí)繪制下一幀。
解析GIF需要GifFormat類(lèi)的幫助。GifFormat的構(gòu)造函數(shù)需要Stream對(duì)象,構(gòu)造函數(shù)認(rèn)為從該Stream對(duì)象中可以讀到gif文件,然后按字節(jié)解析。
GIF圖片是由很多幀構(gòu)成的,每一幀有延續(xù)時(shí)間、處置方法、左邊、上邊等屬性,當(dāng)然還有最重要的圖像數(shù)據(jù)。GifFrame類(lèi)就代表GIF圖片里的幀。
經(jīng)GifFormat解析后的數(shù)據(jù)可由LogicalScreenWidth、LogicalScreenHeight和GetFrames方法獲得。
每當(dāng)設(shè)置Source屬性,如果是gif圖片,就會(huì)重新創(chuàng)建一個(gè)新的GifFormat,然后啟動(dòng)timer。
當(dāng)然,Source URI的方案是多種多樣的,GifImage支持http、ftp、file、pack。
顯示GIF的兩個(gè)重點(diǎn)在MeasureOverride和OnRender方法,它們考慮了Stretch、StretchDirection、Width、Height等屬性。
WpfAnimatedGif
一個(gè)簡(jiǎn)單的在WPF中顯示GIF圖片的庫(kù)使用非常簡(jiǎn)單:在XAML中,替換Source屬性,設(shè)置AnimatedSource附加屬性到想要的圖片Windowx:Class=WpfAnimatedGif.Demo.MainWindowxmlns=http://schemas....