zoukankan      html  css  js  c++  java
  • 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图片 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); // 延迟间隔 ae.SetRepeat(0); //-1:不循环,0:总是循环 播放 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的功能的。但是我实际测试后发现效果非常差,图片黑条泛滥,根本没法看。所以还是使用上面那段代码,相关代码我依然保存在工程里,有兴趣可以自己测试。
  • 相关阅读:
    笑笑
    DoEvents应用
    疑问:感情是骗来的,爱情是睡过的?
    心情不好怎么办
    VB中窗体最顶和最底
    工作之余,轻松一下,笑笑吧.
    SQL Server无日志恢复数据库
    爬虫与Python:(二)Python基础篇——7.列表
    爬虫与Python:(二)Python基础篇——6.编码
    爬虫与Python:(二)Python基础篇——5.字符串
  • 原文地址:https://www.cnblogs.com/danlis/p/6073446.html
Copyright © 2011-2022 走看看