GIF加水印
目的:实现GIF加水印的效果,实现水印文字在GIF移动的效果
脑补知识:帧,GIF是一组帧的集合,帧是一张张图片按照顺序进行展示,每张帧有自己的延迟时间,所以整体来看GIF播放效果就是每张帧延迟一定的时间,最终看到GIF播放的效果
关于帧延迟:该帧的延迟时间就是下一帧的间隔时间
实现思路
通过2345看图王发现一个保存帧的功能,保存之后在一个文件夹下发现了一组静态的图片
也就说明可以从GIF中提取帧
第一步:从GIF提取帧
第二步:对提取之后的帧,也就是每张图单独的使用GDI编程加水印
第三步:关键点:合成,合成不是我来做的用到一个开源的组件Gif.Components,这个组件提供了这个功能
通过给这个组件输入一组按一定顺序的Image对象,并设置一个延迟,最终输出一个GIF图片 实现我们加水印的功能
提取帧
GIF通过绝对路径的方式初始化系统中的一个Image对象,该对象可以获取到GIF所有的帧GetFrameCount
循环遍历,并激活当前帧,在使用gif.Save(fileName, ImageFormat.Jpeg);把帧提取出来最终完成帧的提取工作
下一步就是逐个加水印
WaterMark 来自于别人写的类,可以实现文字水印和图片水印
既然加水印,就可以设置水印的位置,对于提取之后的每张帧,我们在处理完第一张帧是之后,让第二张帧偏移指定的像素,这样合成之后就可以实现文字的移动效果
通过控制x-y 两个方向上的偏移,文字可以实现各种移动的效果
批量加水印
多线程的使用:对此有几点说明
1.在线程上调用方法,所谓多线程,其实就是在线程上调用方法,并且传递你自定义的数据对象【我觉得学习多线程入门这一点一定要记住:方法是在线程上调用的,线程一开启方法就会执行】
2.包:就是传递给线程指定方法的自定义的参数对象
所以我将整个处理GIF加水应的写在一个总的函数里面,GifRun(object gd) 该函数接收一个自定义参数,包括了该函数所需要的全部数据
通过外面的循环实例化线程对象,开始执行每一个加水印的任务【一个GIF的处理就是一个任务,就需要一个线程对象来处理】
注意点:所有的都使用实例对象来完成,暂时不适用静态的方法和字段
美中不足
GIF合成的组件处理完成之后GIf的效果和原始的GIF多少还有些差别,这个地方暂时无法解决