由於一個項目中需要把一組連續的照片轉化為動畫的形式來進行傳輸,所以就研究了一下這方面的東西,後來在開源項目中找到了一個叫做NGif的項目,通過這個項目中提供的方法我們就可以直接實現這方面得需求。但是我發現這個項目並不是直接用C#寫成的,相反,它是調用了一個Java的類,然後轉化為C#的代碼的,這當然不在我們今天的研究范圍之內,因為這個項目中會涉及到GIF文件編碼和解碼的一些問題。我們首先下載這個項目:NGif,下載後編譯項目,我們會得到Gif.Components.dll文件,這就是我們今天要用到的GIF庫。下面我們就來一起學習使用這個庫來編碼和解碼GIF動畫吧!
假如我們要將多張照片生成為一個動畫,那麼只需要這樣:
//定義動畫資源 string[] mFrames=new string[]{"這裡填入要生成動畫的圖片集合"}; //定義最終生成的文件路徑 string mOutputFile = "這裡填入最終生成的GIF動畫文件路徑"; //獲取編碼器實例 AnimatedGifEncoder mEncoder = new AnimatedGifEncoder(); //開始編碼 mEncoder.Start(mOutputFile); //設置每幀的時間為1秒 mEncoder.SetDelay(1000); //設置畫面為不重復,0為重復,-1為不重復 mEncoder.SetRepeat(-1); //添加每一幀畫面 for (int i = 0; i < mFrames.Count; i++) { mEncoder.AddFrame(mFrames[i])); } //結束編碼 mEncoder.Finish();
//獲取解碼器實例 GifDecoder mDecoder = new GifDecoder(); //讀取GIF文件 mDecoder.Read("這裡填入GIF文件的路徑"); for ( int i = 0; i < mDecoder.GetFrameCount(); i++ ) { // 獲取每一幀畫面 Image mFrame= mDecoder.GetFrame(i); //存儲該幀畫面 mFrame.Save("這裡圖片填入存儲路徑"); }從上面的方法,我們可以看出使用這個庫來解碼和編碼GIF是很簡單的,但是我在使用這個庫的時候發現了問題。我想實現的項目是通過反復截取屏幕得到連續的畫面,然後再根據這個庫來生成動畫文件,從理論上來講,這樣是沒有什麼問題的,但是我在測試的過程中發現,以這種方式生成的動畫文件很大,而且浏覽的時候停滯感很強,完全沒有視頻的感覺,如果對於較小的圖片,這樣或許可以,但對於我這個項目而言,很明顯是不能滿足要求的,因為截取屏幕得到的圖片本來就比較大,所以處理的時候就會比較費時間,網上是有這樣一個通過截取屏幕實現屏幕捕捉的項目,只是效率實在太低,即使我們放在線程中仍然需要等待很長的時間,所以這個項目權當玩玩了。