給gif動畫添加水印的初步實現
先貼一下效果圖:
原gif圖像:

添加文字水印之后的圖像

HeroSoft是添加上去的水印。
處理思想:
獲得gif 圖像的每一楨圖像,然后將其加水印,獲得每一楨的延遲時間。生成一個自定義Frame對象,再處理完每一楨之后,再通過程序將這些圖片加上gif 的參數信息,重新生成一個gif文件,目前生成gif部分采用ngif庫,非常慢。正在尋求更好的解決辦法
程序的代碼為,其中有個dll引用
目前我的實現有幾個問題:
1)無法處理透明背景的gif
2)處理速度相當的慢
兄弟們,多提一些意見,解決這個問題,效率問題比較嚴重,目前不能達到應用的程度,就是因為太慢。每一個gif 圖像生成大概得4-10s
原gif圖像:

添加文字水印之后的圖像

HeroSoft是添加上去的水印。
處理思想:
獲得gif 圖像的每一楨圖像,然后將其加水印,獲得每一楨的延遲時間。生成一個自定義Frame對象,再處理完每一楨之后,再通過程序將這些圖片加上gif 的參數信息,重新生成一個gif文件,目前生成gif部分采用ngif庫,非常慢。正在尋求更好的解決辦法
程序的代碼為,其中有個dll引用
1
public static Bitmap WaterMarkWithText(System.Drawing.Bitmap origialGif, string text,string filePath)
2
{
3
//用于存放楨
4
List<Frame> frames = new List<Frame>();
5
//如果不是gif文件,直接返回原圖像
6
if (origialGif.RawFormat.Guid != System.Drawing.Imaging.ImageFormat.Gif.Guid)
7
{
8
return origialGif;
9
}
10
//如果該圖像是gif文件
11
foreach (Guid guid in origialGif.FrameDimensionsList)
12
{
13
System.Drawing.Imaging.FrameDimension frameDimension = new System.Drawing.Imaging.FrameDimension(guid);
14
int frameCount = origialGif.GetFrameCount(frameDimension);
15
for (int i = 0; i < frameCount; i++)
16
{
17
if (origialGif.SelectActiveFrame(frameDimension, i) == 0)
18
{
19
int delay = Convert.ToInt32(origialGif.GetPropertyItem(20736).Value.GetValue(i));
20
Image img = Image.FromHbitmap(origialGif.GetHbitmap());
21
Font font = new Font(new FontFamily("宋體"), 35.0f,FontStyle.Bold);
22
Graphics g = Graphics.FromImage(img);
23
g.DrawString(text, font, Brushes.BlanchedAlmond, new PointF(10.0f, 10.0f));
24
Frame frame = new Frame(img, delay);
25
frames.Add(frame);
26
}
27
}
28
Gif.Components.AnimatedGifEncoder gif = new Gif.Components.AnimatedGifEncoder();
29
gif.Start(filePath);
30
gif.SetDelay(100);
31
gif.SetRepeat(0);
32
for (int i = 0; i < frames.Count; i++)
33
{
34
gif.AddFrame(frames[i].Image);
35
}
36
gif.Finish();
37
try
38
{
39
Bitmap gifImg = (Bitmap)Bitmap.FromFile(filePath);
40
return gifImg;
41
}
42
catch
43
{
44
return origialGif;
45
}
46
}
47
return origialGif;
48
}
public static Bitmap WaterMarkWithText(System.Drawing.Bitmap origialGif, string text,string filePath)2
{3
//用于存放楨4
List<Frame> frames = new List<Frame>();5
//如果不是gif文件,直接返回原圖像6
if (origialGif.RawFormat.Guid != System.Drawing.Imaging.ImageFormat.Gif.Guid)7
{8
return origialGif;9
}10
//如果該圖像是gif文件11
foreach (Guid guid in origialGif.FrameDimensionsList)12
{13
System.Drawing.Imaging.FrameDimension frameDimension = new System.Drawing.Imaging.FrameDimension(guid);14
int frameCount = origialGif.GetFrameCount(frameDimension);15
for (int i = 0; i < frameCount; i++)16
{ 17
if (origialGif.SelectActiveFrame(frameDimension, i) == 0)18
{19
int delay = Convert.ToInt32(origialGif.GetPropertyItem(20736).Value.GetValue(i));20
Image img = Image.FromHbitmap(origialGif.GetHbitmap());21
Font font = new Font(new FontFamily("宋體"), 35.0f,FontStyle.Bold);22
Graphics g = Graphics.FromImage(img);23
g.DrawString(text, font, Brushes.BlanchedAlmond, new PointF(10.0f, 10.0f));24
Frame frame = new Frame(img, delay);25
frames.Add(frame);26
}27
}28
Gif.Components.AnimatedGifEncoder gif = new Gif.Components.AnimatedGifEncoder(); 29
gif.Start(filePath);30
gif.SetDelay(100);31
gif.SetRepeat(0);32
for (int i = 0; i < frames.Count; i++)33
{ 34
gif.AddFrame(frames[i].Image); 35
}36
gif.Finish();37
try38
{39
Bitmap gifImg = (Bitmap)Bitmap.FromFile(filePath); 40
return gifImg;41
}42
catch43
{44
return origialGif;45
}46
}47
return origialGif;48
}目前我的實現有幾個問題:
1)無法處理透明背景的gif
2)處理速度相當的慢
兄弟們,多提一些意見,解決這個問題,效率問題比較嚴重,目前不能達到應用的程度,就是因為太慢。每一個gif 圖像生成大概得4-10s
作者:jillzhang
出處:http://jillzhang.cnblogs.com/
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。
出處:http://jillzhang.cnblogs.com/
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。


浙公網安備 33010602011771號