c#实现图片gif去水印
2017-08-30 00:45
525 查看
做项目时候会遇到在网络上爬的源文件,png图片或者动画gif背景都带有水印,“百度出品”“不得转载”等等,这样出来的文件放在项目里面当做自己的资源来用肯定是不可以的,现在就来用lockbits替换背景的颜色,实现水印消除的目的。话不多述,上图:
处理前:
这是处理之前的图,其实底部的“baidu汉语“看着并不是很明显(仔细看),仍然需要把字体的背部水印去掉,这里开始用lockbits来去水印了。
处理后:
具体步骤:
创建a,b,c,d四个文件夹,所有的动画gif原图放到a文件夹中,将其分解成多个图片之后存储到b文件夹中,然后就需要lockbits操作处理之后存储到c文件夹中,同理最后的合成操作将c中所有被处理的背景图片合成为gif存储到d文件夹中,这样就批量将所有gif图片去水印了。
这里主要放lockbits处理单个图片代码,所有操作放在后面的demo中,这里是用c#语言写的小程序。
这里获取到带有水印的图片的颜色替换为正常的背景白色:
图片合成gif动画的方法:
后面直接放一个demo了
Demo下载,点击此处
处理前:
这是处理之前的图,其实底部的“baidu汉语“看着并不是很明显(仔细看),仍然需要把字体的背部水印去掉,这里开始用lockbits来去水印了。
处理后:
具体步骤:
创建a,b,c,d四个文件夹,所有的动画gif原图放到a文件夹中,将其分解成多个图片之后存储到b文件夹中,然后就需要lockbits操作处理之后存储到c文件夹中,同理最后的合成操作将c中所有被处理的背景图片合成为gif存储到d文件夹中,这样就批量将所有gif图片去水印了。
这里主要放lockbits处理单个图片代码,所有操作放在后面的demo中,这里是用c#语言写的小程序。
void backBit() { for (int i = 0; i <count; i++) { String num = dst_path +dirTmp+"\\frame_" + i + ".png"; Bitmap bm = new Bitmap(num); //pictureBox2.Image = SetImageColorPoint(bm, new Point(18, 72), Color.Green, 0); //pictureBox2.Image = SetImageColorAll(bm, Color.FromArgb(237, 240, 242), Color.White, 20); pictureBox2.Image = SetImageColorAll(bm, Color.FromArgb(242, 242, 242), Color.White, 20); String num1 = deal_path+ dirTmp+"\\frame_" + i + ".png"; pictureBox2.Image.Save(num1); lGif.Add(num1); } }
这里获取到带有水印的图片的颜色替换为正常的背景白色:
public static Image SetImageColorAll(Image p_Image, Color p_OdlColor, Color p_NewColor, int p_Float) { int _Width = p_Image.Width; int _Height = p_Image.Height; Bitmap _NewBmp = new Bitmap(_Width, _Height, PixelFormat.Format32bppArgb); Graphics _Graphics = Graphics.FromImage(_NewBmp); _Graphics.DrawImage(p_Image, new Rectangle(0, 0, _Width, _Height)); _Graphics.Dispose(); //图片背景处理的操作 BitmapData _Data = _NewBmp.LockBits(new Rectangle(0, 0, _Width, _Height), ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb); _Data.PixelFormat = PixelFormat.Format32bppArgb; int _ByteSize = _Data.Stride * _Height; byte[] _DataBytes = new byte[_ByteSize]; Marshal.Copy(_Data.Scan0, _DataBytes, 0, _ByteSize); int _WhileCount = _Width * _Height; int _Index = 0; for (int i = 0; i != _WhileCount; i++) { Color _Color = Color.FromArgb(_DataBytes[_Index + 3], _DataBytes[_Index + 2], _DataBytes[_Index + 1], _DataBytes[_Index]); if (ScanColor(_Color, p_OdlColor, p_Float)) { _DataBytes[_Index + 3] = (byte)p_NewColor.A; _DataBytes[_Index + 2] = (byte)p_NewColor.R; _DataBytes[_Index + 1] = (byte)p_NewColor.G; _DataBytes[_Index] = (byte)p_NewColor.B; } _Index += 4; } Marshal.Copy(_DataBytes, 0, _Data.Scan0, _ByteSize); _NewBmp.UnlockBits(_Data); return _NewBmp; }
private static bool ScanColor(Color p_CurrentlyColor, Color p_CompareColor, int p_Float) { int _R = p_CurrentlyColor.R; int _G = p_CurrentlyColor.G; int _B = p_CurrentlyColor.B; return (_R <= p_CompareColor.R + p_Float && _R >= p_CompareColor.R - p_Float) && (_G <= p_CompareColor.G + p_Float && _G >= p_CompareColor.G - p_Float) && (_B <= p_CompareColor.B + p_Float && _B >= p_CompareColor.B - p_Float); }
图片合成gif动画的方法:
void Com(){ String outputFilePath = com_path + tmp; Gif.Components.AnimatedGifEncoder ae = new Gif.Components.AnimatedGifEncoder(); ae.Start(outputFilePath); ae.SetDelay(100); // 延迟间隔\r\n ae.SetRepeat(0); int i = 0; int count = lGif.Count; //-1:不循环,0:总是循环 播放 \r\n for (; i < count; i++) { ae.AddFrame(Image.FromFile(lGif[i])); } ae.Finish(); //MessageBox.Show("合成成功!"); }
后面直接放一个demo了
Demo下载,点击此处
相关文章推荐
- .net c# gif动画如何添加图片水印实现思路及代码学习
- c#实现图片gif去水印
- .net c# gif动画如何添加图片水印实现思路及代码
- .net c# gif动画如何添加图片水印实现思路及代码
- .net c# gif动画如何添加图片水印
- [转]C#实现给图片加透明度水印
- ASP.NET图片加水印的实现代码(C#)
- C# :实现水印与图片合成,并利用Graphics 压缩图像质量 , (委托实现listBox的动态添加提示)
- ASP.NET图片加水印的实现代码(C#)
- C# :实现水印与图片合成,并利用Graphics 压缩图像质量 , (委托实现listBox的动态添加提示)。。。。。。。。。。。。
- c# 怎样实现用几张图片制作 gif?怎样对图片像素值进行修改?上代码
- C#实现图片压缩、水印、裁剪等功能介绍
- Windows Mobile C#实现GIF图片播放
- C# 添加图片水印类实现代码
- gif的动画图片,可否实现文字水印和图片水印的效果呢?
- C#实现拆分、合并GIF图片
- C#实现给图片加透明度水印
- C# GDI+ 简单实现图片写文字和图片叠加(水印)
- C#实现GIF图片播放