为gif动画添加水印-有具体实现[2008-02-15日更新]

更新:有了改善了性能的具体实现。速度提升几百倍

更新:早晨的版本在计算格帧之间时间延迟上有错误,现更正,纠正了动画变快或者变慢的问题

2007年,曾发过两篇解决为gif动画添加水印的文章,分别为:
给gif动画添加水印的初步实现
改善了性能的gif动画添加水印
当时,没有将完整的实现放上来,过去的一年中,陆陆续续的接到好多朋友的邮件,希望能发一份完整的实现,但由于移动硬盘毁坏,原来的代码已经找不到了,一直没能给大家一个很好的回复,深表歉意,现在将完整的程序重新实现了一遍,速度比较慢的,但思路基本有了,希望能给大家一个交待。
原图片:

水印后:


比去年版本的改进:
1)解决了各帧之间间隔变快的问题
未解决的问题
1)效率问题(2008-02-15已有更新,有了改善性能后的具体实现,速度提升几百倍
2)透明背景的处理

项目文件:
/Files/jillzhang/Gif.rar
改善性能后的具体实现:/Files/jillzhang/Gif_Faster.rar

更新:早晨的版本在计算格帧之间时间延迟上有错误,现更正,纠正了动画变快或者变慢的问题

纠正后版本:/Files/jillzhang/Gif_Faster_LastEdited.rar (最新 2008-02-15 17:49)

原来错误的将
int delay = ora_Img.GetPropertyItem(20736).Value[i]
其实ora_Img.GetPropertyItem(20736).Value获得的是1个byte[],这个数组中每四位代表1个delay值。
现已经更正为 int delay = BitConverter.ToInt32(buffer, i * 4);

作者:jillzhang
出处:http://jillzhang.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
标签: gif水印
posted @ 2008-02-14 18:02 Robin Zhang 阅读(4972) 评论(37) 编辑 收藏

 回复 引用 查看   
#1楼 2008-02-14 18:08 carysun      
我觉得透明的处理应该是比较重要的,如果水印很大的就影响原来的效果了
我用过iText对PDF进行过加水印,能满足一般的功能,gif的没弄过

 回复 引用   
#2楼 2008-02-14 18:18 奡[未注册用户]
还是变快
 回复 引用 查看   
#3楼[楼主] 2008-02-14 19:21 jillzhang      
@奡
不快了呀
@carysun
透明处理,我现在还没有思路,请指点一下

 回复 引用 查看   
#4楼 2008-02-14 21:56 Kingthy      
看看先..
 回复 引用 查看   
#5楼 2008-02-14 22:08 Kingthy      
刚试了.效率太低了哦

PS:你说的是将GIF图片弄成透明还是水印透明?
GIF图片透明的话在你还原某帧图像时使用GetHbitmap(Color color)这个重载方法设置透明背景色不可以吗?
水印图片透明就使用DrawImage中一个带ImageAttributes(在这里可以设置图像的透明度)参数的重载方法就可以了..

 回复 引用   
#6楼 2008-02-15 01:07 台州[未注册用户]
GIF比较麻烦
 回复 引用 查看   
#7楼 2008-02-15 05:04 fox23      
谢谢分享~
 回复 引用 查看   
#8楼 2008-02-15 07:49 BlackCat      
mark
 回复 引用   
#9楼 2008-02-15 08:16 zh_z[未注册用户]
谢谢您!试一下先
 回复 引用 查看   
#10楼 2008-02-15 08:38 carysun      
@jillzhang
我用的是封装好的类

 回复 引用 查看   
#11楼[楼主] 2008-02-15 09:09 jillzhang      
@Kingthy
@zh_z
2008-02-15已有更新,有了改善性能后的具体实现,速度提升几百倍

 回复 引用 查看   
#12楼 2008-02-15 09:59 Wisdom-zh      
不错的实现
 回复 引用 查看   
#13楼[楼主] 2008-02-15 10:35 jillzhang      
@Kingthy
GIF图片透明的话在你还原某帧图像时使用GetHbitmap(Color color)这个重载方法设置透明背景色不可以吗?
-------------------------------------------------------------
经测验,此方法无效

 回复 引用   
#14楼 2008-02-15 10:57 xm[未注册用户]
速度还是不一样
 回复 引用 查看   
#15楼 2008-02-15 12:19 Superstone      
透明的GIF图片.NET是做不出来的,反正我是没有搞出来过,PNG的倒是可以的。好像.NET2.0的FRAMEWORK不支持透明的GIF图像,还请了解的大大指教。
 回复 引用 查看   
#16楼 2008-02-15 15:38 flank.chen      
恩.
 回复 引用 查看   
#18楼[楼主] 2008-02-15 17:53 jillzhang      
@奡
@xm
速度的问题已经修正,多谢指点

 回复 引用 查看   
#19楼[楼主] 2008-02-15 17:56 jillzhang      
目前,遗留的问题有
1)有些gif动画在水印后背景色变化
2)水印后gif文件体积增加较大
我想我以前对透明色的理解有误,实际上是背景色的问题。但仍然没有解决办法,望达人继续指点

 回复 引用   
#20楼 2008-02-15 22:27 Laidz[未注册用户]
感谢博主
 回复 引用   
#21楼 2008-02-15 22:49 laobing[未注册用户]
正是我想要的,搂主真是及时雨亚
多谢多谢

 回复 引用   
#22楼 2008-02-16 06:25 太感谢了![未注册用户]
太感谢了!我找了一个通宵,在我快绝望的时候,发现了你!!!
 回复 引用   
#23楼 2008-02-16 06:50 太感谢了![未注册用户]
能有一些相关说明文档或实例就好了,我们能更快的上手了!!

 回复 引用   
#24楼 2008-02-16 08:16 imf[未注册用户]
我觉得应该还要把字体可以提供给我们选择,还有水印的位置等,这些参数让我们可以调整,那应该就很完善了!
 回复 引用 查看   
#25楼[楼主] 2008-02-16 09:34 jillzhang      
@Laidz
@太感谢了!
不客气,互相学习
@imf
这些你可以自己更改。如果我做成那样,相反增加了难度,脱离了我的初衷,因为你说的那些是水印的范畴,而不是为gif动画水印的范畴

 回复 引用   
#26楼 2008-02-17 02:50 wise_sandy[未注册用户]
感谢~
 回复 引用 查看   
#27楼[楼主] 2008-02-17 07:36 jillzhang      
@wise_sandy
不客气

 回复 引用 查看   
#28楼 2008-02-17 11:42 Edwin Liu      
关注
 回复 引用   
#29楼 2008-02-18 01:39 imf[未注册用户]
哈,兄弟,我又来关注你一下了。。那些功能我都已能修改好了。再次感谢了。
不过有个问题,不知你能否帮解决?就是在添加文字的时候,可以为添加的文字进行描边?谢谢啦!!

 回复 引用 查看   
#30楼[楼主] 2008-02-19 20:57 jillzhang      
@imf
对不起,这个我没有具体实现过

 回复 引用   
#31楼 2008-02-20 19:37 imf[未注册用户]
我原来的思路是描绘二次,第一次是加粗体,第二次是正常体,可是,描绘二次后,对齐问题,所以,效果不好。。再者加粗产生的描边也是很细的!看到网上的资料,可以对文字进行描边。呵呵,可是GDI 俺是为了搞这个东东才开始看的,很难懂呀!拜托你看能不能帮我抽个空来改一下呢?谢谢!
 回复 引用 查看   
#32楼 2008-03-13 00:04 →遇建←      
有收获,谢谢博主。
 回复 引用   
#33楼 2008-04-21 14:14 叶小[未注册用户]
所有jif图片都变成了900多K啊,体积为什么变得那么大啊?
 回复 引用 查看   
#34楼[楼主] 2008-04-22 09:03 jillzhang      
http://www.cnblogs.com/jillzhang/archive/2008/04/19/1128263.html
另外,水印后图像体积变大,是gif文件格式造成的,有的图片要完成水印效果,变大体积是必须的

 回复 引用 查看   
#35楼 2008-04-23 08:46 xhxssj      
博主麻烦给份代码学习学习谢谢~~~~~~~~~~
 回复 引用   
#36楼 2008-05-05 11:49 rebect[未注册用户]
jillzhang
给您发三次邮件了,就是不会,在这里留言吧~~
问个问题,我感觉你的组件很好用...先感谢了!
但有资源不释放的情况,就是每执行一次内存一直被占2-4M(我的图片大小160K),被大量调用的时候非常恐怖..........
我无法释放资源....您能给个办法吗??

 回复 引用   
#37楼 2008-05-05 15:15 jillzhang
@rebect
不好意思,可能没太注意

你下载的版本太老了吧,试试这个
http://www.cnblogs.com/jillzhang/archive/2008/04/19/1128263.html

 回复 引用 查看   
#38楼 2010-04-24 21:40 lubu      
大大的支持,狠狠的支持。
博主大人好,可以发一份给我学习下吗?bslts@163.com