改善了性能的gif动画添加水印

昨天的实现,效率非常低,基本要10s左右,今天重新改良了一下gif的Encoder,效率提高了不,基本实现了gif添加水印,但透明的gif在添加水印的时候仍然存在问题,有时间再研究研究
原gif

水印之后的图片为:

但是,透明背景的却有些问题
原图

水印后

改动的部分

 1  protected void GetImagePixels()
 2        {
 3            int w = image.Width;
 4            int h = image.Height;
 5            //        int type = image.GetType().;
 6            if ((w != width)
 7                || (h != height)
 8                )
 9            {
10                // create new image with right size/format
11                Image temp =
12                    new Bitmap(width, height);
13                Graphics g = Graphics.FromImage(temp);
14                g.DrawImage(image, 00);
15                image = temp;
16                g.Dispose();
17            }

18            /*
19                ToDo:
20                improve performance: use unsafe code 
21            */

22            pixels = new Byte[3 * image.Width * image.Height];
23            int count = 0;
24            Bitmap tempBitmap = new Bitmap(image);
25            int wh = image.Width;
26            int he = image.Height;
27            System.Drawing.Imaging.BitmapData bmpData = tempBitmap.LockBits(new Rectangle(00, wh, he), System.Drawing.Imaging.ImageLockMode.ReadWrite, image.PixelFormat);
28            unsafe
29            {
30                byte* p = (byte*)bmpData.Scan0.ToPointer();
31                for (int i = 0; i < 4 * wh * he; i += 4)
32                {
33                    pixels[count] = *(p + i+2);
34                    count++;
35                    pixels[count] = *(p + i + 1);
36                    count++;
37                    pixels[count] = *(p + i );
38                    count++;
39                }

40            }

41            tempBitmap.UnlockBits(bmpData);
42            //count = 0;
43            //for (int th = 0; th < image.Height; th++)
44            //{
45            //    for (int tw = 0; tw < image.Width; tw++)
46            //    {
47            //        Color color = tempBitmap.GetPixel(tw, th);
48            //        pixels[count] = color.R;
49            //        count++;
50            //        pixels[count] = color.G;
51            //        count++;
52            //        pixels[count] = color.B;
53            //        count++;
54            //    }
55            //}
56
57            //        pixels = ((DataBufferByte) image.getRaster().getDataBuffer()).getData();
58        }
注释部分是原来代码
目前仍然有两个问题:
1)透明背景
2)生成的文件体积变大
望得到更多的指教
作者:jillzhang
出处:http://jillzhang.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
posted @ 2006-11-07 18:15 Robin Zhang 阅读(3430) 评论(33) 编辑 收藏

 回复 引用   
#1楼 2006-11-07 20:10 个人简历[未注册用户]

博主写的很好,学到很多东西。。。

 回复 引用 查看   
#2楼 2006-11-08 22:07 沐枫      
楼主指针操作的那一段似乎仅仅是拷贝。
那么为什么不直接用 Marshal.Copy(pixels, 0, bmpData.Scan0, 4 * wh * he)呢?
当然,pixels要改成new byte[4*...]

 回复 引用   
#3楼 2007-01-22 14:28 李宏宇[未注册用户]
看了您的两篇关于gif动画水印的文章,受益非浅,不知道现在还存在的问题您解决了吗?如果给以能否给我一份完整的最新代码让我学习一下,不胜感谢
邮箱lihy@51do.com.cn

 回复 引用   
#4楼 2007-05-02 23:37 Randy[未注册用户]
谢谢博主提供的资料

透明背景我也没有能解决..但我主要是用在jpg上加上gif的动画~~ 背景一般是jpg格式的..

在gif分桢的时候用了 bit.MakeTransparent(Color.FromArgb(0, 0, 211));

把生成的的桢的背景去掉变成透明的.

 回复 引用   
#5楼 2007-05-10 14:47 fff[未注册用户]
看看 不错
 回复 引用   
#6楼 2007-06-08 08:49 steven[未注册用户]
很关注lz的这个专题,希望lz继续
 回复 引用   
#7楼 2007-06-08 09:36 steven[未注册用户]
能否发个完整代码压缩文件给我,万分感谢。
SL_shn@163.com

 回复 引用   
#8楼 2007-06-11 14:13 tanher[未注册用户]
能否也发个完整的代码给我?非常感谢!
yingherjun@gmail.com

 回复 引用   
#9楼 2007-07-20 09:11 我爱周星星[未注册用户]
楼主,请问这是用什么语言写的呢,是ASP吗?我不太懂哦,可以告诉我吗?或者给我完整的代码?非常非常感谢!xiaoming2374@163.com
 回复 引用   
#10楼 2007-09-10 11:31 天地水云间[未注册用户]
对楼主的这个功能非常感兴趣,楼主可可否发个完整的压缩文件给我!大家互相交流学习!:)
万分感谢!
d7sky@163.com
qq:125348778

 回复 引用   
#11楼 2007-09-11 16:24 surfpion[未注册用户]
这个技术苦于研究了很久,没有很好解决;

能否提供一份的源码,先谢谢了!


surfpioneer@163.com

一个老程序员

 回复 引用   
#12楼 2007-09-29 09:02 boji8888@163.com[未注册用户]
博主的东西都是好东西,可否发个最后修改好的源码呢?boji8888@163.com
谢谢了

 回复 引用   
#13楼 2007-11-19 00:24 小林ss[未注册用户]
也发一份给我,谢谢楼主了!!
 回复 引用   
#14楼 2007-11-19 00:25 小林ss[未注册用户]
也发一份给我,谢谢楼主了!!
lxx@fj35.com

 回复 引用   
#15楼 2007-12-13 00:17 王霄[未注册用户]
我也希望要一份.
谢谢楼主了!!!
8960cn@163.com

 回复 引用   
#16楼 2007-12-31 01:53 刘昕[未注册用户]
楼主能给我一份么 谢谢了 lx8902072@16.com
 回复 引用   
#17楼 2007-12-31 02:05 刘昕[未注册用户]
流泪了 终于找到了 lx8902072@163.com 谢谢
 回复 引用   
#18楼 2008-01-02 14:19 laidz[未注册用户]
同求完整代码
谢谢
laidezhong@gmail.com

 回复 引用 查看   
#19楼[楼主] 2008-01-02 14:49 jillzhang      
@刘昕
@laidz
@刘昕
这个代码是很久之前的了,目前我手头上也找不到具体实现。
过一段有时间了,重新实现一遍,好了后,发到各位邮箱里面

 回复 引用   
#20楼 2008-01-02 21:07 lvkoo[未注册用户]
我正在找此类文章。学习中。发我一份代码我研究下。谢谢楼主^_^
lk0227@163.com

 回复 引用   
#21楼 2008-02-12 09:59 zh_z[未注册用户]
学习学习能给我发一份代码吗谢谢您zh_zjie@163.com
 回复 引用 查看   
#22楼[楼主] 2008-02-12 15:38 jillzhang      
 回复 引用   
#23楼 2008-02-14 08:46 zh_z[未注册用户]
谢谢您
 回复 引用   
#24楼 2008-02-14 10:22 zh_z[未注册用户]
有一个问题已经发到邮箱上请指教谢谢您
 回复 引用 查看   
#26楼[楼主] 2008-02-14 18:03 jillzhang      
重新实现了一把,实现项目到http://www.cnblogs.com/jillzhang/archive/2008/02/14/1068955.html下载
 回复 引用   
#27楼 2008-02-15 08:21 zh_z[未注册用户]
谢谢您
 回复 引用   
#28楼 2008-05-10 22:35 001[未注册用户]
我也正在搜集这方面的资料,可否发给我一份呀,谢谢了.....
E-mail:scyyzgxh@163.com

 回复 引用 查看   
#29楼 2008-06-27 10:28 resake      
楼主能否给我一份?项目里要用到。谢谢
resake@yeah.net