C# GIF圖片的分解以及合成

dll下載的地址
 
使用主要調用的是Components這個代碼庫,引用dll就能夠了。
 
 
做者:
如下爲這條鏈接的博客園內容:
 思路很簡單,就是先把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的功能的。可是我實際測試後發現效果很是差,圖片黑條氾濫,根本無法看。因此仍是使用上面那段代碼,相關代碼我依然保存在工程裏,有興趣能夠本身測試。
相關文章
相關標籤/搜索