c#实现图片gif去水印「建议收藏」

做项目时候会遇到在网络上爬的源文件,png图片或者动画gif背景都带有水印,“百度出品”“不得转载”等等,这样出来的文件放在项目里面当做自己的资源来用肯定是不可以的,现在就来用lockbits替换背景的颜色,实现水印消除的目的。话不多述,上图:处理前:这是处理之前的图,其实底部的“baidu汉语“看着并不是很明显(仔细看),仍然需要把字体的背部水印去掉,这里开始用lockbits来去水印了。处理

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

做项目时候会遇到在网络上爬的源文件,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("合成成功!");
}

后面直接放一个demo了

Demo下载,点击此处

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/127232.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • java:闰年判断程序[通俗易懂]

    java:闰年判断程序[通俗易懂]公历闰年的简单计算方法(符合以下条件之一的年份即为闰年)1、能被4整除而不能被100整除。2、能被400整除。方案:使用数学运算符取余运算(%),关系运算符等于(==)和不等于(!=),辑运算符逻辑与(&&)和逻辑或(||),来判断某年是否为闰年,判断的结果为boolean类型的值,如果为闰年boolean类型的值为true,否则为falsebooleanflag=(year%4==0&&year%100!=0)||year%400==0

    2022年7月17日
    10
  • Intellij IDEA 导入 eclipse web 项目详细操作[通俗易懂]

    IntellijIDEA导入eclipseweb项目详细操作第一步:准备工具我用的是IntelliJIDEA2017.1(64)这个版本的,在eclipse中找到我之前写skye_cnmy(非Maven),skye_client(Maven)的项目导入。第二步:在IntellijIDEAFile–&gt;New–&gt;ProjectfromExisting…

    2022年4月15日
    51
  • 页面左侧二级菜单20种案例「建议收藏」

    页面左侧二级菜单20种案例「建议收藏」 本文由码农网&amp;nbsp;–小峰原创,转载请看清文末的转载要求,欢迎参与我们的付费投稿计划!jQuery作为一款主流的JavaScript前端开发框架,深受广告开发者的亲睐,同时jQuery有着不计其数的插件,特别是菜单插件更为丰富,本文将要为大家介绍20个绚丽而实用的jQuery侧边栏菜单,这些侧边栏菜单可以用在不同风格的网页上,如…

    2022年5月4日
    72
  • 分享67套基于Java开发的Java毕业设计实战项目(含源码+毕业论文)【新星计划】

    分享67套基于Java开发的Java毕业设计实战项目(含源码+毕业论文)【新星计划】【新星计划】分享67套基于Java开发的Java毕业设计实战项目(含源码+毕业论文)基于Java开发的Java毕业设计实战项目本文中的所有主题都来自互联网。如果您侵犯您的权利,请及时联系Blogger,博主将及时处理。投诉邮箱:1919101926@qq.com(没事勿扰,不接单,也没时间解决难题,谢谢配合)。文章目录->建议收藏关注+点赞<-基于Java开发的Java毕业设计实战项目前言Java毕业设计所用到的开发环境Java毕业设计项目简单介绍17套基于Java开发的[互

    2022年9月1日
    2
  • Sublime Text 3 注册/激活方法

    Sublime Text 3 注册/激活方法Sublime是一款很好用的编辑器,虽然是免费使用,但是经常会弹出吆喝着让你购买(purchase)的弹窗,对一名优秀的强迫症来说看久了还是很烦人的。而且现在网上很多注册码都不可用。那么要怎么解决呢?下面提供两种解决方案。(我是在win10系统上操作的)二、方案方案一[1]1)建立一个bat文件(随便取个名字,如“runHost.bat”),复制以下代码到…

    2022年7月27日
    5
  • js网页如何获取手机屏幕宽度

    js网页如何获取手机屏幕宽度

    2021年10月31日
    48

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号