把两个透明背景的gif图片,合成为一个gif动画。图片1:(d:\test\001.gif)
图片2:(d:\test\002.gif)
合并代码:           ImageCodecInfo codecInfo = null;
            ImageCodecInfo[] codecs = ImageCodecInfo.GetImageDecoders();
            foreach (ImageCodecInfo codec in codecs) if (codec.FormatID == ImageFormat.Gif.Guid) codecInfo = codec;
            EncoderParameters eps = null;            //第一帧
            System.Drawing.Image gif = System.Drawing.Image.FromFile(@"d:\test\001.gif");
            eps = new EncoderParameters(1);
            eps.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.SaveFlag, (long)EncoderValue.MultiFrame);
             gif.Save(@"d:\test\out.gif", codecInfo, eps); //输出的gif动图            //第二帧
            System.Drawing.Image image = System.Drawing.Image.FromFile(@"d:\test\002.gif");
            eps = new EncoderParameters(1);
            eps.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.SaveFlag, (long)EncoderValue.FrameDimensionTime); 
            gif.SaveAdd(image, eps);
            image.Dispose();            //结束
            eps = new EncoderParameters(1);
            eps.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.SaveFlag, (long)EncoderValue.Flush);
            gif.SaveAdd(eps);
            gif.Dispose();合成之后,输出文件out.gif的第二帧有问题,里面包含了第一帧的内容:
请问,我是不是少做了什么?没有把第一帧的内容清空掉?谢谢!!!

解决方案 »

  1.   

    连延时什么的都没有设置,应该生成不正确了
    参考:
    /// <summary>
            /// 把directory文件夹里的png文件生成为gif文件,放在giffile
            /// </summary>
            /// <param name="directory">png文件夹</param>
            /// <param name="giffile">gif保存路径</param>
            /// <param name="time">每帧的时间/ms</param>
            /// <param name="repeat">是否重复</param>
            public static void PngsToGif(string directory, string giffile, int time, bool repeat)
            {
                //一般文件名按顺序排
                string[] pngfiles = Directory.GetFileSystemEntries(directory, "*.png");
                
                AnimatedGifEncoder e = new AnimatedGifEncoder();
                e.Start(giffile);            //每帧播放时间
                e.SetDelay(500);
                
                //-1:不重复,0:重复
                e.SetRepeat(repeat?0:-1);
                for (int i = 0, count = pngfiles.Length; i < count; i++)
                {
                    e.AddFrame(Image.FromFile(pngfiles[i]));
                }
                e.Finish();
            }
      

  2.   

    你好,我这么写只是为了更加清晰的表达问题所在。我完整的代码是把一张gif动态图片进行分解,然后逐帧加水印,再重新合并。你说的加延时等是通过SetPropertyItem加进去的。假如图片背景不是透明的,已经是可以完全正常使用,因为新帧会把前一帧的内容覆盖。但是遇到透明背景的帧就出问题了。合并后出现下面这这种情况:
      

  3.   

    https://www.cnblogs.com/danlis/p/6073446.html
      

  4.   

    没有看到你对控制块 Graphic Control Label(0xf9) 的处置代码
    其中
    disposal_method:指出处置图形的方法,当值为:
                            0 - 不使用处置方法
                            1 - 不处置图形,把图形从当前位置移去
                            2 - 回复到背景色
                            3 - 回复到先前状态
                          4-7 - 自定义
    Delay Time : 单位1/100秒,如果值不为1,表示暂停规定的时间后再继续往下处理数据流
    Transparent Color Index : 透明色索引值
    都影响着展示效果