Java实现数字水印

2023-05-16

数字水印有可见不可见之分,可见的比如课件上印有学校校徽,微博发图片会水印上上传者的信息及微博logo等。

  用java实现可见的数字水印,草人主要是用到了java.awt包中的AlphaComposite类,当然在实现之前先介绍一下AlphaComposite类:

  AlphaComposite类是关于两个目标重叠的混合处理类,此类实现的特定规则是 T. Porter 和 T. Duff 合著的 “Compositing Digital Images”, SIGGRAPH 84, 253-259 中描述的 12 条基本规则集。该类提供的一个getInstance的方法,其中的两个参数为rule和alpha,第二个参数将由调用者设置一个alpha值,即是透明度的设置,而第一个参数则是混合方式。此类扩展了 Porter 和 Duff 定义的方程,包含一个额外的因子。AlphaComposite 类的实例可以包含一个 alpha 值,在将该值用于混合方程之前,可以用它来修改不透明度和每个源像素的覆盖率。

  Porter和 Duff 的论文在混合方程的描述中使用了以下因子:

  以规则SRC_OVER为例,使用这些因子,Porter 和 Duff 定义了 12 种选择混合因子 Fs 和 Fd 的方法,从而产生了 12 种令人满意的可视效果。在对 12 个指定可视效果的静态字段的描述中,给出了具有确定 Fs 和 Fd 值的方程。SRC_OVER在目标色之上合成源色(Porter-Duff Source Over Destination 规则)。指定Fs = 1 和 Fd = (1-As),因此:

     Ar = As + Ad*(1-As)
   Cr = Cs + Cd*(1-As)
  该类扩展后一共有24中规则,定义了9个方法,由于草人的程序中用到了方法getInstance()就对之说明一下——
  •详细定义:public static AlphaComposite getInstance(int rule, float alpha)
  •功能:创建一个 AlphaComposite 对象,它具有指定的规则和用来乘源色 alpha 值的常量 alpha 值。在将源色与目标色合成前,要将源色乘以指定的 alpha 值。
  •参数:rule——合成规则,24种;alpha——将乘源色的 alpha 值的常量 alpha 值。alpha 必须是范围 [0.0, 1.0] 之内(包含边界值)的一个浮点数字。
  •抛出:IllegalArgumentException - 如果 alpha 小于 0.0 或大于 1.0,或者 rule 是以下规则之一:CLEAR、SRC、DST、SRC_OVER、DST_OVER、SRC_IN、DST_IN、SRC_OUT、DST_OUT、SRC_ATOP、DST_ATOP 或 XOR。
既然是图像处理,就先创建一个java2d对象 
Graphics2D g2d=image.createGraphics();
//用源图像填充背景
g2d.drawImage(image, 0, 0, image.getWidth(), image.getHeight(), null, null);  

然后为 Graphics2D 上下文设置 Composite后就可以将想要写入的文字或者图片写入源图片上

AlphaComposite ac = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha);
//为 Graphics2D 上下文设置 Composite。 Composite 用于所有绘制方法中,如 drawImage、
//drawString、draw 和 fill。 它指定新的像素如何在呈现过程中与图形设备上的现有像素组合。
g2d.setComposite(ac);

public class Watermark2{
public Watermark2(){super();};
/**
* 在源图片上设置水印文字
*/
public void WordsToImage(String srcImagePath,float alpha,
String font,int fontStyle,int fontSize,Color color,
String inputWords,int x,int y,String imageFormat,String toPath) throws IOException{
FileOutputStream fos=null;
try {
//读取图片
BufferedImage image = ImageIO.read(new File(srcImagePath));
//创建java2D对象
Graphics2D g2d=image.createGraphics();
//用源图像填充背景
g2d.drawImage(image, 0, 0, image.getWidth(), image.getHeight(), null, null);

        //!!!!
        AlphaComposite ac = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha);
        //为 Graphics2D 上下文设置 Composite。 Composite 用于所有绘制方法中,如 drawImage、
        //drawString、draw 和 fill。 它指定新的像素如何在呈现过程中与图形设备上的现有像素组合。 
        g2d.setComposite(ac);  

        //设置文字字体名称、样式、大小
        g2d.setFont(new Font(font, fontStyle, fontSize));
        g2d.setColor(color);//设置字体颜色
        g2d.drawString(inputWords, x, y); //输入水印文字及其起始x、y坐标
        g2d.dispose();
        //将水印后的图片写入toPath路径中
        fos=new FileOutputStream(toPath);
        ImageIO.write(image, imageFormat, fos);
    } 
    //文件操作错误抛出
    catch (Exception e) {
       e.printStackTrace();
    }finally{
        if(fos!=null){
            fos.close();
        }
    }
}

/**
   *  在源图像上设置图片水印  
 */
public void ImageToImage(String srcImagePath,String appendImagePath,
        float alpha,int x,int y,int width,int height,
        String imageFormat,String toPath) throws IOException{
        FileOutputStream fos = null;
    try {
        //读图
        BufferedImage image = ImageIO.read(new File(srcImagePath));
        //创建java2D对象
        Graphics2D g2d=image.createGraphics();
        //用源图像填充背景
        g2d.drawImage(image, 0, 0, image.getWidth(), image.getHeight(), null, null);

        //关键地方
        AlphaComposite ac = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha);
        g2d.setComposite(ac);

        BufferedImage appendImage = ImageIO.read(new File(appendImagePath));
        g2d.drawImage(appendImage, x, y, width, height, null, null);
        g2d.dispose();
        fos=new FileOutputStream(toPath);
        ImageIO.write(image, imageFormat, fos);
    } catch (Exception e) {
       e.printStackTrace();
    }finally{
        if(fos!=null){
            fos.close();
        }
    }
}

public static void main(String[] args) throws Exception
{
    Watermark2 imageObj = new Watermark2();
    //源图片路径
    String srcImagePath = "F:/27.jpg";
    //水印图片路径
    String appendImagePath = "F:/logo.jpg";
    // ---- 宋体 普通字体 77号字 红色 透明度0.4"
    float alpha = 0.4F;
    String  font = "宋体";
    int fontStyle = Font.PLAIN;
    int fontSize = 77;
    Color color = Color.RED;

    String inputWords = "图片上设置水印文字";
    int x = 1700;
    int y = 77;
    String imageFormat = "jpg";
    //水印文字后的存储路径
    String wToPath = "F:/31.png";
    //水印图片后的存储路径
    String IToPath = "F:/7.png" ;
    imageObj.WordsToImage(srcImagePath, alpha, font, fontStyle,
            fontSize, color, inputWords, x, y, imageFormat, wToPath); 
    imageObj.ImageToImage(srcImagePath, appendImagePath, alpha, 
            x, y, 300, 200, imageFormat, IToPath);


}

}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java实现数字水印 的相关文章

  • 【网络安全】Kali linux超详细入门教程,Linux初学者勿进

    学习网络安全的同学应该都听过 Kali Linux 的大名 xff0c Kali Linux 相比与普通 Linux 附带了大量入侵和渗透的工具和软件 xff0c 在渗透测试和白帽子方面处于业界领先 正是因为这个原因 xff0c 许多人都会
  • Ubuntu登录管理员账户时,输入密码后一直在登录界面循环

    Ubuntu登录管理员账户时 xff0c 输入密码后 xff0c 一直在登录界面循环 xff0c 进不去系统界面 百度了好久 xff0c 也没有找到解决的办法 xff0c 我只能说百度真够可以的了 果断翻墙Google xff0c 找到不少
  • PreparedStatement和Statement的区别与联系

    一 概念 1 PreparedStatement xff1a PreparedStatement是java sql包下面的一个接口 xff0c 用来执行SQL语句查询 xff0c 通过调用connection preparedStateme
  • C#编程规范

    http www cnblogs com zyh nhy archive 2007 10 11 921250 html 第一章 概述 规范制定原则 1 方便代码的交流和维护 2 不影响编码的效率 xff0c 不与大众习惯冲突 3 使代码更美
  • c++,vc6.0 报错unreferenced local variable

    c 43 43 xff0c vc6 0 报错 unreferenced local variable 原因 xff0c 有的东西没有用到 xff0c 如果真的没有用的话可以直接删掉
  • Servlet学习之生成随机数

    令页面生成一个每五秒产生一个数字的动态图 span class token keyword package span com span class token punctuation span servlet span class toke
  • 程序员也该懂点UI细节

    虽然说项目开发过程中 xff0c 美工和程序各司其职 但是很多时候程序员本身也要知道一些UI设计的细节 一 每个页面的功能上要突出重点 比如说你首页是想引导更多用户注册的话 xff0c 你就要把注册按钮突出出来 如果你首页是你想引导用户更快
  • ftp 客户端软件的传输模式ASCII和二进制

    FTP可用多种格式传输文件 xff0c 通常由系统决定 xff0c 大多数系统 包括UNIX系统 只有两种模式 xff1a 文本模式和二进制模式 文本传输器使用ASCII字符 xff0c 并由回车键和换行符分开 xff0c 而二进制不用转换
  • 百度2015校园招聘软件开发笔试题及答案

    简单题 xff08 本题共30分 xff09 请简述Tcp ip的3次握手以及4次挥手过程 xff1f 并解释为何关闭连接需要4次挥手 10分 详细答案参见TCP IP协议三次握手与四次握手流程解析 TCP三次握手 四次挥手过程如下 通常情
  • 一步一步定制自己的google map(各个省市的经纬度查询)

    安徽省 合肥 北纬31 52 东经117 17 安徽省 安庆 北纬30 31 东经117 02 安徽省 蚌埠 北纬32 56 东经117 21 安徽省 亳州 北纬33 52 东经115 47 安徽省 巢湖 北纬31 36 东经117 52
  • 网页刷新或者重新加载后滚动条的位置不变

    在开发的过程中我们经常需要重新加载或者刷新某个画面 xff0c 已确保数据显示是最新的 但是如果一丁点改变就刷新画面的话 xff0c 会导致用户体验很差 xff0c 想想看你好不容易把网页拖到最后 xff0c 结果点击某个按钮的时候 xff
  • 番茄工作法(番茄钟时间管理)

    番茄工作法是我一次偶然的时间在网上看到的 xff0c 因为自己性格大大咧咧 丢三落四 xff0c 所以经常容易在时间问题上犯迷糊 很多人都有时间拖沓症 xff0c 就是一件事不到最后阶段不去解决它 比如你有一个星期的时间写的毕业论文 xff
  • jquery中美元符号($)命名冲突

    在Jquery中 xff0c 是JQuery的别名 xff0c 所有使用 的地方也都可以使用JQuery来替换 xff0c 如 39 msg 39 等同于JQuery 39 msg 39 的写法 然而 xff0c 当我们引入多个js库后 x
  • js实现省市联动

    效果图如下 xff1a 思路很简单 xff0c 就是先加载省信息 xff0c 然后当省改变的时候加载市县信息 烦的是数据的录入 xff0c 代码如下 lt DOCTYPE html PUBLIC 34 W3C DTD XHTML 1 0 T
  • 正则在小偷程序中的应用(续)

    获取资源信息 content 61 file get contents 34 http list sososteel com qg list html pg 61 1 amp h 61 34 time 对抓取的信息进行处理 取class为l
  • mysql密码过期问题解决方案

    mysql密码过期问题解决方案 问题再现 xff1a 密码过期 旧电脑许久没有用 xff0c 今天打开发现数据库连接不上了 提示密码过期 xff0c 请修改密码 ERROR 1862 HY000 Your password has expi
  • 安装MITIE的条件

    1 版本 在安装rasa xff08 1 1 8 xff0c 其它版本应该也行 xff09 时候必须安装mitie xff0c 下面是我安装mitie时的环境 xff1a 1 VS2017 装没装忘记了 xff0c 但是电脑中有Micros
  • Linux重启命令 / 查看、重启、禁用网卡命令 / 修改IP / 操作防火墙命令

    重启命令 1 reboot 2 shutdown r now 立刻重启 root用户使用 3 shutdown r 10 过10分钟自动重启 root用户使用 4 shutdown r 20 35 在时间为20 35时候重启 root用户使
  • Centos下rpm离线下载与安装命令

    xff08 1 xff09 安装yum即相关插件 sudo apt get install yum sudo apt get install yum utils sudo yum install yum plugin downloadonl
  • Windows下搭建Vxworks开发环境,VMware虚拟机实现

    这是本人自己整理的笔记 xff0c 参考了两篇文章 xff0c 大同小异 参考的第一篇 xff1a http hi baidu com hezhe1008 blog item 26e5cd53364eb314377abe01 html 参考

随机推荐

  • 使用opencv下的sift进行特征匹配(python)

    1 安装opencv 首先确保安装了opencv包和vs2015 xff0c 命令为 xff1a pip install opencv python 也可以直接下载安装文件 xff0c 测试代码 import cv2 import nump
  • CentOS7.0上用命令安装Chrome浏览器。

    1 配置yum下载源 xff1a 在目录 etc yum repos d 下新建文件 google chrome repo 并且在该文件中添加如下内容 xff1a 1 google chrome 2 name 61 google chrom
  • centos7安装anaconda

    步骤一 xff1a 删除centos7中自带有python2 7 xff08 可选 xff09 xff08 1 xff09 强制删除已安装python及其关联 rpm qa grep python xargs rpm ev allmatch
  • new释放内存理解c++

    释放内存后 xff0c 本身抄指针的内容是不会改变的即指针指向没有变 xff0c 但是它里面保存的地址所对应的内存在系统里标记为未使用的即指向的内存区域已经被系统收回了 xff0c 这块内存随时可能会被分配给其他进程或进程里面的变量使用 x
  • archlinux BIOS+BMR 安装记录

    声明 xff01 xff01 本安装指南采用的是传统的BIOS 43 BMR分区方案 43 GRUB引导 适用于早期的电脑 现在大多电脑基本都是UEFI 43 GPT xff0c 这种方案 安装前准备 制作启动盘 1 xff0c 下载arc
  • MAC Please reinstall Android Studio form screatch

    遇到问题的流程 xff0c 是误操作关闭了Kotlin插件 xff0c 重启的时候提示这个信息 解决办法 xff1a 资源库 Preferences AndroidStudio4 0 下面找到disabled plugins txt文件 删
  • 关于zookeeper启动一闪而过的情况

    问题描述 笔者在虚拟机启动zk cmd无论怎么启动都是闪退的情况 解决方案 在cmd文件加个pause查看问题 如下图所示 64 echo off REM Licensed to the Apache Software Foundation
  • jupyter notebook error: FileNotFoundError: [WinError 2]

    文章目录 问题现象解决方法 问题现象 Traceback most recent call last File 34 D Anaconda3 envs robot env lib site packages tornado web py 3
  • Hp 4200添加为网络打印机的步骤

    物理连接 1 只要连接电源 网线即可 设置打印机IP 1 在打印机控制面板上按下 键 xff0c 进入菜单 xff1b 2 按下 或 找到 CONFIGURE DEVICE xff08 配置设备 xff09 选项 xff0c 按下 键 xf
  • Qt内置浏览器引擎WebEngine调试和分析方法

    问题背景 H5和JS代码写好了 xff0c 在浏览器里调试也一切OK xff0c 然后嵌入到Qt中 xff0c 发现各种问题 xff0c 这时候 xff0c 如何在Qt框架下调试Web的代码呢 xff1f 调试方法 在Qt帮助文档中 xff
  • IOS开发之——网络-视频播放-JSON解析(11)

    一 概述 解析JSON结果到OC类通过视频播放地址构成视频播放器并播放显示网络请求 xff0c 返回视频播放列表 xff0c 点击列表中的一项进行播放 二 Main storyboard 三 解析JSON结果到OC类 3 1 JSON数据
  • 华为交换机 ssh和Telnet远程登录配置命令

    华为交换机 ssh和Telnet远程登录配置命令 联系方式 QQ481715271 简单拓扑 LSW4 vlan 20配置地址的原因是SSH Telnet 都可以登录 LSW3 配置 vlan batch 10 20 interface V
  • CentOS7配置yum本地源时报错Repository ‘centos7-media‘: Error parsing config

    错误如下 xff1a 已加载插件 xff1a fastestmirror Repository 39 centos7 media 39 Error parsing config Error parsing 34 gpgkey 61 39 f
  • 深入理解Tomcat虚拟目录

    我们知道 xff0c Web网站中的内容 xff08 包括网页 xff0c 图片 xff0c 音频文件等 xff09 一般都存放在App的目录下 但随着网站内容的不断丰富 xff0c 用户需要把不同层次的内容组织成网站的子目录 我们通常的做
  • Spring Security 实现身份认证

    Spring Security可以运行在不同的身份认证环境中 xff0c 当我们推荐用户使用Spring Security进行身份认证但并不推荐集成到容器管理的身份认证中时 xff0c 但当你集成到自己的身份认证系统时 xff0c 它依然是
  • Spring Security身份认证之UserDetailsService

    zhiqian我们采用了配置文件的方式从数据库中读取用户进行登录 虽然该方式的灵活性相较于静态账号密码的方式灵活了许多 xff0c 但是将数据库的结构暴露在明显的位置上 xff0c 绝对不是一个明智的做法 本文通过Java代码实现UserD
  • 基于Apache OLTU的OAuth2.0授权解决方案

    Apache OLTU实现了OAuth 2 0的规范 xff0c 是一种可靠的Java授权解决方案 但是 xff0c 官方文档实在是太惨不忍睹了 本文参考了开涛的 OAuth 2 0集成Shiro文章 模拟了OAuth2 0的认证流程 技术
  • Couch的MapReduce查询

    1 MapReduce介绍 传统的关系型数据库中 xff0c 只要你的数据是结构化的 xff0c 你可以进行任何类型的查询 Apache Couch与此相反 xff0c 它使用MapReduce xff08 预定义的map和的reduce方
  • Java遍历读取文件目录结构

    Java读取计算机目录 xff0c 并打印 public class ReadDirectory 文件所在的层数 private int fileLevel 生成输出格式 64 param name 输出的文件名或目录名 64 param
  • Java实现数字水印

    数字水印有可见不可见之分 xff0c 可见的比如课件上印有学校校徽 xff0c 微博发图片会水印上上传者的信息及微博logo等 用java实现可见的数字水印 xff0c 草人主要是用到了java awt包中的AlphaComposite类