1. import java.awt.AlphaComposite;
    import java.awt.Color;
    import java.awt.Font;
    import java.awt.Graphics2D;
    import java.awt.Image;
    import java.awt.RenderingHints;
    import java.awt.image.BufferedImage;
    import java.awt.image.ImageObserver;
    import java.io.*;
    import java.net.URL;
    import java.util.Date;
  2.  
  3. import javax.imageio.ImageIO;
    import javax.servlet.ServletOutputStream;
    import javax.servlet.http.HttpServletResponse;
    import javax.swing.ImageIcon;
  4.  
  5. /*******************************************************************************
    * Description: 图片水印工具类
    * @author zhaoronglei
    * @version 1.0
    */
    public class ImageRemarkUtil {
  6.  
  7. // 水印透明度
    private static float alpha = 0.5f;
    // 水印横向位置
    private static int positionWidth = 150;
    // 水印纵向位置
    private static int positionHeight = 300;
    // 水印文字字体
    private static Font font = new Font("宋体", Font.BOLD, 72);
    // 水印文字颜色
    private static Color color = Color.red;
  8.  
  9. /**
    *
    * @param alpha
    * 水印透明度
    * @param positionWidth
    * 水印横向位置
    * @param positionHeight
    * 水印纵向位置
    * @param font
    * 水印文字字体
    * @param color
    * 水印文字颜色
    */
    public static void setImageMarkOptions(float alpha, int positionWidth,
    int positionHeight, Font font, Color color) {
    if (alpha != 0.0f)
    ImageRemarkUtil.alpha = alpha;
    if (positionWidth != 0)
    ImageRemarkUtil.positionWidth = positionWidth;
    if (positionHeight != 0)
    ImageRemarkUtil.positionHeight = positionHeight;
    if (font != null)
    ImageRemarkUtil.font = font;
    if (color != null)
    ImageRemarkUtil.color = color;
    }
  10.  
  11. /**
    * 给图片添加水印图片
    *
    * @param iconPath
    * 水印图片路径
    * @param srcImgPath
    * 源图片路径
    * @param targerPath
    * 目标图片路径
    */
    public static void markImageByIcon(String iconPath, String srcImgPath,
    String targerPath,HttpServletResponse response) {
    markImageByIcon(iconPath, srcImgPath, targerPath, null,response);
    }
  12.  
  13. /**
    * 给图片添加水印图片、可设置水印图片旋转角度
    *
    * @param iconPath
    * 水印图片路径
    * @param srcImgPath
    * 源图片路径
    * @param targerPath
    * 目标图片路径
    * @param degree
    * 水印图片旋转角度
    */
    public static void markImageByIcon(String iconPath, String srcImgPath,
    String targerPath, Integer degree,HttpServletResponse response) {
    Date start = new Date();
    ServletOutputStream os = null;
    InputStream is;
    Image srcImg;
    try {
    //远程,被覆盖的图片
    if(srcImgPath.contains("http")){
    URL url1 = new URL(srcImgPath);
    is = url1.openStream();
    }else{
    //本地
    is = getFile(srcImgPath);
    }
    srcImg = ImageIO.read(is);
  14.  
  15. BufferedImage buffImg = new BufferedImage(srcImg.getWidth(null),
    srcImg.getHeight(null), BufferedImage.TYPE_INT_RGB);
  16.  
  17. // 1、得到画笔对象
    Graphics2D g = buffImg.createGraphics();
  18.  
  19. // 2、设置对线段的锯齿状边缘处理
    g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
    RenderingHints.VALUE_INTERPOLATION_BILINEAR);
  20.  
  21. g.drawImage(
    srcImg.getScaledInstance(srcImg.getWidth(null),
    srcImg.getHeight(null), Image.SCALE_SMOOTH), 0, 0,
    null);
    // 3、设置水印旋转
    if (null != degree) {
    g.rotate(Math.toRadians(degree),
    (double) buffImg.getWidth() / 2,
    (double) buffImg.getHeight() / 2);
    }
  22.  
  23. // 4、水印图片的路径 水印图片一般为gif或者png的,这样可设置透明度
    // 5、得到Image对象。
    Image img = ImageIO.read(getFile(iconPath));
    // 6、水印图片的位置
    g.drawImage(img, 0, 0, null);
    // 5、设置水印文字颜色
    g.setColor(color);
    // 6、设置水印文字Font
    g.setFont(font);
    // 7、设置水印文字透明度
    g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha));
    // 8、第一参数->设置的内容,后面两个参数->文字在图片上的坐标位置(x,y)
    g.drawString("复印无效", positionWidth, positionHeight);
    // 7、释放资源
    g.dispose();
  24.  
  25. // 8、生成图片
    //os = new FileOutputStream(targerPath);
    response.setHeader("Cache-Control", "no-store, no-cache");
    response.setContentType("image/jpeg");
    os = response.getOutputStream();
    ImageIO.write(buffImg, "JPG", os);
    Date end = new Date();
    System.out.println("图片完成添加水印图片");
    System.out.println("处理时间:"+(end.getTime()-start.getTime())/1000+"秒");
  26.  
  27. } catch (Exception e) {
    e.printStackTrace();
    } finally {
    try {
    if (null != os)
    os.close();
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    }
  28.  
  29. /**
    * 给图片添加水印文字
    *
    * @param logoText
    * 水印文字
    * @param srcImgPath
    * 源图片路径
    * @param targerPath
    * 目标图片路径
    */
    public static void markImageByText(String logoText, String srcImgPath,
    String targerPath) {
    markImageByText(logoText, srcImgPath, targerPath, null);
    }
  30.  
  31. /**
    * 给图片添加水印文字、可设置水印文字的旋转角度
    *
    * @param logoText
    * @param srcImgPath
    * @param targerPath
    * @param degree
    */
    public static void markImageByText(String logoText, String srcImgPath,
    String targerPath, Integer degree) {
  32.  
  33. InputStream is = null;
    OutputStream os = null;
    try {
    // 1、源图片
    Image srcImg = ImageIO.read(new File(srcImgPath));
    BufferedImage buffImg = new BufferedImage(srcImg.getWidth(null),
    srcImg.getHeight(null), BufferedImage.TYPE_INT_RGB);
  34.  
  35. // 2、得到画笔对象
    Graphics2D g = buffImg.createGraphics();
    // 3、设置对线段的锯齿状边缘处理
    g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
    RenderingHints.VALUE_INTERPOLATION_BILINEAR);
    g.drawImage(
    srcImg.getScaledInstance(srcImg.getWidth(null),
    srcImg.getHeight(null), Image.SCALE_SMOOTH), 0, 0,
    null);
    // 4、设置水印旋转
    if (null != degree) {
    g.rotate(Math.toRadians(degree),
    (double) buffImg.getWidth() / 2,
    (double) buffImg.getHeight() / 2);
    }
    // 5、设置水印文字颜色
    g.setColor(color);
    // 6、设置水印文字Font
    g.setFont(font);
    // 7、设置水印文字透明度
    g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,
    alpha));
    // 8、第一参数->设置的内容,后面两个参数->文字在图片上的坐标位置(x,y)
    g.drawString(logoText, positionWidth, positionHeight);
    // 9、释放资源
    g.dispose();
    // 10、生成图片
    os = new FileOutputStream(targerPath);
    ImageIO.write(buffImg, "JPG", os);
  36.  
  37. System.out.println("图片完成添加水印文字");
  38.  
  39. } catch (Exception e) {
    e.printStackTrace();
    } finally {
    try {
    if (null != is)
    is.close();
    } catch (Exception e) {
    e.printStackTrace();
    }
    try {
    if (null != os)
    os.close();
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    }
    private static FileInputStream getFile(String srcImgPath) throws FileNotFoundException {
    String filePath = String.valueOf(Thread.currentThread().getContextClassLoader().getResource(""))+"../../"; //项目路径
    filePath = filePath.replaceAll("file:/", "");
    filePath = filePath.replaceAll("%20", " ");
    filePath = filePath.trim() + srcImgPath.trim();
    if(filePath.indexOf(":") != 1){
    filePath = File.separator + filePath;
    }
    return new FileInputStream(new File(filePath));
    }
    public static void main(String[] args) {
    ImageIcon image= new ImageIcon(ClassLoader.getSystemResource("img/112.png"));
    String srcImgPath = "d:/pic/gantan.jpg";
    String logoText = "复 印 无 效";
    String iconPath = "d:/pic/112.png";
  40.  
  41. String targerTextPath = "d:/qie_text.jpg";
    String targerTextPath2 = "d:/qie_text_rotate.jpg";
  42.  
  43. String targerIconPath = "d:/qie_icon.jpg";
    String targerIconPath2 = "d:/qie_icon_rotate.jpg";
  44.  
  45. System.out.println("给图片添加水印文字开始...");
    // 给图片添加水印文字
    markImageByText(logoText, srcImgPath, targerTextPath);
    // 给图片添加水印文字,水印文字旋转-45
    markImageByText(logoText, srcImgPath, targerTextPath2, -45);
    System.out.println("给图片添加水印文字结束...");
  46.  
  47. System.out.println("给图片添加水印图片开始...");
    setImageMarkOptions(0.3f, 1, 1, null, null);
    // 给图片添加水印图片
    //markImageByIcon(iconPath, srcImgPath, targerIconPath,response);
    // 给图片添加水印图片,水印图片旋转-45
    //markImageByIcon(iconPath, srcImgPath, targerIconPath2, -45);
    System.out.println("给图片添加水印图片结束...");
    }
    }

一个在java后台实现的对图片进行加网纹或水印的工具类的更多相关文章

  1. java操作redis集群配置[可配置密码]和工具类(比较好用)

    转: java操作redis集群配置[可配置密码]和工具类 java操作redis集群配置[可配置密码]和工具类     <dependency>   <groupId>red ...

  2. java操作redis集群配置[可配置密码]和工具类

    java操作redis集群配置[可配置密码]和工具类     <dependency>   <groupId>redis.clients</groupId>   & ...

  3. java内部类、接口、集合框架、泛型、工具类、实现类

    .t1 { background-color: #ff8080; width: 1100px; height: 40px } 一.内部类 1.成员内部类. (1)成员内部类的实例化: 外部类名.内部类 ...

  4. Java并发指南9:AQS共享模式与并发工具类的实现

    一行一行源码分析清楚 AbstractQueuedSynchronizer (三) 转自:https://javadoop.com/post/AbstractQueuedSynchronizer-3 ...

  5. java生成图片验证码(转)--封装生成图片验证码的工具类

    博客部分内容转载自 LonlySnow的博客:后台java 实现验证码生成 1.controller方法 @RequestMapping(value = "/verifycode/img&q ...

  6. Java判断访问设备为手机、微信、PC工具类

    package com.lwj.util; import javax.servlet.http.HttpServletRequest; /** * 判断访问设备为PC或者手机--工具类 * * @de ...

  7. Java学习笔记43(打印流、IO流工具类简单介绍)

    打印流: 有两个类:PrintStream,PrintWriter类,两个类的方法一致,区别在于构造器 PrintStream:构造方法:接收File类型,接收字符串文件名,接收字节输出流(Outpu ...

  8. Java精选笔记_集合概述(Collection接口、Collections工具类、Arrays工具类)

    集合概述 集合有时又称为容器,简单地说,它是一个对象,能将具有相同性质的多个元素汇聚成一个整体.集合被用于存储.获取.操纵和传输聚合的数据. 使用集合的技巧 看到Array就是数组结构,有角标,查询速 ...

  9. Java并发(基础知识)——显示锁和同步工具类

    显示锁                                                                                     Lock接口是Java ...

随机推荐

  1. Android进程间通信

    http://www.cnblogs.com/manuosex/p/3588634.html 一.Linux系统进程间通信有哪些方式? 1.socket: 2.name pipe命名管道: 3.mes ...

  2. 项目总结一:响应式之CSS3 媒体查询

    1.<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scala ...

  3. Python Nose框架编写测试用例方法

    1. 关于Nose nose项目是于2005年发布的,也就是 py.test改名后的一年.它是由 Jason Pellerin 编写的,支持与 py.test 相同的测试习惯做法,但是这个包更容易安装 ...

  4. Integrates Git with Sublime 3 to pull or push to Github by using Sublime plugin Git

    1. Git must be installed, Sublime plugin "Git" only connects Sublime with Git. Download UR ...

  5. SpringBoot的几个使用技巧

    SpringBoot的几个使用技巧 首先提供几个SpringBoot开发过程中常用的网站: Spring Boot官方文档:http://docs.spring.io/spring-boot/docs ...

  6. 微信小程序---wx.request(OBJECT)

    详情 :https://mp.weixin.qq.com/debug/wxadoc/dev/api/network-request.html#wxrequestobject 1: 首先要配置你的域名 ...

  7. 本地存储之localStorage

    localStorage 本地存储 .对象.存数据 .取数据 存储的数据量在20M左右 localStorage 是window下面的属性,用的时候可以省略window 数据只能存储字符串类型的 lo ...

  8. Ionic3 遇到的一些错误-Error: Cannot find module 'reflect-metadata'

    E:\Projects\ionic\myApp5>ionic serve Error: Cannot find module 'reflect-metadata' 解决方法: npm insta ...

  9. hihocoder 1015题

    代码 #include <iostream> #include <string> #include <typeinfo> #include <vector&g ...

  10. [译]ASP.NET Core 2.0 布局页面

    问题 如何在ASP.NET Core 2.0项目中共享可见元素.代码块和指令? 答案 新建一个空项目,首先添加GreetingService服务和UserViewModel模型: public int ...