C#實現GIF圖片反轉

來源:互聯網
上載者:User

首先看下:

然後是兩張gif的對比
   //原本圖是正著走的
   //處理後是倒著走的

gif是動態嘛。然後我昨天和一個朋友聊天的時候發了一串相同的gif圖,然後看著千篇一律的東西。我想能不能寫個程式實現gif的初始狀態不同呢。什麼意思呢。我們知道,gif是由幀構成的,我想實現的功能是比如一個gif共有十幀,那麼我寫出來的程式能夠產生10個gif檔案,分別對應不同的初始狀態來進行迴圈。後來一想,gif幀太多的話,比較慢,而且也不實用,於是決定簡化一下,只做一個反轉工具,比如一個gif是從左至右播放的,通過這個成功可以產生一個相同的gif圖,不過是倒著播放的。

思路很簡單,就是先把gif分解成很多幀,然後對幀進行合并,合并幀之前把幀的位置反轉一下就可以了。因為我自己對影像處理的知識不懂,只想到了思路,所以這些功能都要找些資料,然後修改,測試。

分割幀的代碼如下

 //解碼gif圖片        public List<string> GetFrames(stringpPath,stringpSavedPath)        {            Image gif=Image.FromFile(pPath);            FrameDimension fd=newFrameDimension(gif.FrameDimensionsList[0]);             //擷取幀數(gif圖片可能包含多幀,其它格式圖片一般僅一幀)            intcount=gif.GetFrameCount(fd);            List<string>gifList=newList<string>();            //以Jpeg格式儲存各幀             for(inti=0;i<count;i++)              {                  gif.SelectActiveFrame(fd,i);                  gif.Save(pSavedPath+"\\frame_"+i+".png",ImageFormat.Png);                  gifList.Add(pSavedPath+"\\frame_"+i+".png");              }            returngifList;         }

 


可以看到,返回了一個包含所有產生的幀地址的list列表。然後就是使用gifList作為參數來合并了。

 
//擷取系統臨時目錄存放解碼後的png圖片\r\n                stringtemppath=System.Environment.GetEnvironmentVariable("TEMP");                 List<string>gifList=GetFrames(tBoxFile.Text,temppath);                gifList.Reverse();                StringoutputFilePath="new.gif";                AnimatedGifEncoder ae=newAnimatedGifEncoder();                ae.Start(outputFilePath);                ae.SetDelay(100);    // 延遲間隔\r\n                ae.SetRepeat(0);  //-1:不迴圈,0:總是迴圈 播放  \r\n                for(inti=0,count=gifList.Count;i<count;i++)                {                    ae.AddFrame(Image.FromFile(gifList[i]));                }                ae.Finish();                MessageBox.Show("成功!新檔案已儲存在同目錄");

 


這裡面使用了AnimatedGifEncoder這個類,這是Gif.Components.dll動態串連庫裡的類(此庫開源,文末給出地址),是我在codeProject上找到的。首先我把gifList反轉,然後合并儲存到同目錄。中間產生的幀為了方便我儲存到了temp目錄。

本來這個庫裡是分割gif的功能的。但是我實際測試後發現效果非常差,圖片黑條泛濫,根本沒法看。所以還是使用上面那段代碼,相關代碼我依然儲存在工程裡,有興趣可以自己測試。

項目源碼:gif反轉工具

參考:

C#圖片處理:擷取GIF 動畫圖片中的各個幀
NGif, Animated GIF Encoder for .NET

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.