专业网站建设品牌,十四年专业建站经验,服务6000+客户--广州京杭网络
免费热线:400-683-0016      微信咨询  |  联系我们

c#如何去除gif图片水印实现方法

当前位置:网站建设 > 技术支持
资料来源:网络整理       时间:2023/2/14 1:18:12       共计:3641 浏览

大家好,又见面了,我是你们的朋友全栈君。  


做项目时候会遇到在网络上爬的源文件,png图片或者动画gif背景都带有水印,“百度出品”“不得转载”等等,这样出来的文件放在项目里面当做自己的资源来用肯定是不可以的,现在就来用lockbits替换背景的颜色,实现水印消除的目的。话不多述,上图:


处理前:



这是处理之前的图,其实底部的“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("合成成功!");

}

版权说明:
本网站凡注明“广州京杭 原创”的皆为本站原创文章,如需转载请注明出处!
本网转载皆注明出处,遵循行业规范,如发现作品内容版权或其它问题的,请与我们联系处理!
欢迎扫描右侧微信二维码与我们联系。
·上一条:C#去除gif图片水印的操作方法 | ·下一条:C#使用AngleSharp库解析html文档

Copyright © 广州京杭网络科技有限公司 2005-2025 版权所有    粤ICP备16019765号 

广州京杭网络科技有限公司 版权所有