C#GIF卡通编码与解码库NGIF

C#GIF动画编码与解码库NGIF

         由于一个项目中需要把一组连续的照片转化为动画的形式来进行传输,所以就研究了一下这方面的东西,后来在开源项目中找到了一个叫做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();

         同样的,对于GIF文件我们可以通过解码获取文件中的每一帧画面,代码如下:

            //获取解码器实例
	    GifDecoder mDecoder = new GifDecoder();
           //读取GIF文件
            mDecoder.Read("这里填入GIF文件的路径");
	    for ( int i = 0; i < mDecoder.GetFrameCount(); i++ ) 
	    {
                   // 获取每一帧画面
	           Image mFrame= mDecoder.GetFrame(i);
                   //存储该帧画面
		   mFrame.Save("这里图片填入存储路径");
	    }
         从上面的方法,我们可以看出使用这个库来解码和编码GIF是很简单的,但是我在使用这个库的时候发现了问题。我想实现的项目是通过反复截取屏幕得到连续的画面,然后再根据这个库来生成动画文件,从理论上来讲,这样是没有什么问题的,但是我在测试的过程中发现,以这种方式生成的动画文件很大,而且浏览的时候停滞感很强,完全没有视频的感觉,如果对于较小的图片,这样或许可以,但对于我这个项目而言,很明显是不能满足要求的,因为截取屏幕得到的图片本来就比较大,所以处理的时候就会比较费时间,网上是有这样一个通过截取屏幕实现屏幕捕捉的项目,只是效率实在太低,即使我们放在线程中仍然需要等待很长的时间,所以这个项目权当玩玩了。