把两个透明背景的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的第二帧有问题,里面包含了第一帧的内容:
请问,我是不是少做了什么?没有把第一帧的内容清空掉?谢谢!!!
图片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的第二帧有问题,里面包含了第一帧的内容:
请问,我是不是少做了什么?没有把第一帧的内容清空掉?谢谢!!!
参考:
/// <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();
}
其中
disposal_method:指出处置图形的方法,当值为:
0 - 不使用处置方法
1 - 不处置图形,把图形从当前位置移去
2 - 回复到背景色
3 - 回复到先前状态
4-7 - 自定义
Delay Time : 单位1/100秒,如果值不为1,表示暂停规定的时间后再继续往下处理数据流
Transparent Color Index : 透明色索引值
都影响着展示效果