Java 给图片和动图添加水印的方法

这两天根据需求在做图片上传添加水印,实话说重来不知道java还可以这样操作,既然有个这要求我就去找资料研究了一番,现在把它分享一下,希望能帮到有需要的兄弟。

给普通图片添加水印和给动图添加水印是不一样的,给普通图片添加水印用的是java自带的方法写的,给动图使用了gif4j框架,这个框架在CSDN里面很多可以下载,建议下载破解版的,因为原来的jar包会有自带的一个水印是去不了的。

import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
//这下面是 gif4j 框架的类
import com.gif4j.GifDecoder;
import com.gif4j.GifEncoder;
import com.gif4j.GifImage;
import com.gif4j.GifTransformer;
import com.gif4j.TextPainter;
import com.gif4j.Watermark;
/**
 * Created by ZXD on 2018/1/18.
 */
public class ImageRemarkUtil {
  // 水印透明度
  private float alpha = 0.5f;
  // 水印横向位置
  private int positionWidth = 150;
  // 水印纵向位置
  private int positionHeight = 300;
  //水印宽
  private int width = 80;
  //水印高
  private int height = 80;
  // 水印文字字体
  private Font font = new Font("宋体", Font.BOLD, 72);
  // 水印文字颜色
  private Color color = Color.red; 

  /***********普通图片加水印***********/ 

  /**
   *
   * @param alpha
   *      水印透明度
   * @param positionWidth
   *      水印横向位置
   * @param positionHeight
   *      水印纵向位置
   * @param font
   *      水印文字字体
   * @param color
   *      水印文字颜色
   */
  public void setImageMarkOptions(float alpha, int positionWidth,
                      int positionHeight,int width,int height, Font font, Color color) {
    if (alpha != 0.0f)
      this.alpha = alpha;
    if (positionWidth != 0)
      this.positionWidth = positionWidth;
    if (positionHeight != 0)
      this.positionHeight = positionHeight;
    if (height != 0)
      this.height = height;
    if (width != 0)
      this.width = width;
    if (font != null)
      this.font = font;
    if (color != null)
      this.color = color;
  } 

  /**
   * 给图片添加水印图片
   *
   * @param iconPath
   *      水印图片路径
   * @param srcImgPath
   *      源图片路径
   * @param targerPath
   *      目标图片路径
   */
  public void markImageByIcon(String iconPath, String srcImgPath,
                    String targerPath) {
    markImageByIcon(iconPath, srcImgPath, targerPath, null);
  } 

  /**
   * 给图片添加水印图片、可设置水印图片旋转角度
   *
   * @param iconPath
   *      水印图片路径
   * @param srcImgPath
   *      源图片路径
   * @param targerPath
   *      目标图片路径
   * @param degree
   *      水印图片旋转角度
   */
  public void markImageByIcon(String iconPath, String srcImgPath,
                    String targerPath, Integer degree) {
    OutputStream os = null;
    try { 

      Image srcImg = ImageIO.read(new File(srcImgPath));
      BufferedImage buffImg = new BufferedImage(srcImg.getWidth(null),
          srcImg.getHeight(null), BufferedImage.TYPE_INT_RGB); 

      // 1、得到画笔对象
      Graphics2D g = buffImg.createGraphics(); 

      // 2、设置对线段的锯齿状边缘处理
      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);
      // 3、设置水印旋转
      if (null != degree) {
        g.rotate(Math.toRadians(degree),
            (double) buffImg.getWidth() / 2,
            (double) buffImg.getHeight() / 2);
      } 

      // 4、水印图片的路径 水印图片一般为gif或者png的,这样可设置透明度
      ImageIcon imgIcon = new ImageIcon(iconPath); 

      // 5、得到Image对象。
      Image img = imgIcon.getImage(); 

      g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,
          alpha)); 

      Integer X = srcImg.getWidth(null); 

      Integer Y = srcImg.getHeight(null); 

      // 6、水印图片的位置
      g.drawImage(img, X-(positionWidth+width), Y-(positionHeight+height),width,height,null); 

      g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER));
      // 7、释放资源
      g.dispose(); 

      // 8、生成图片
      os = new FileOutputStream(targerPath);
      ImageIO.write(buffImg, "JPG", os); 

      System.out.println("图片完成添加水印图片"); 

    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      try {
        if (null != os)
          os.close();
      } catch (Exception e) {
        e.printStackTrace();
      }
    }
  } 

  /**
   * 给图片添加水印文字
   *
   * @param logoText
   *      水印文字
   * @param srcImgPath
   *      源图片路径
   * @param targerPath
   *      目标图片路径
   */
  public void markImageByText(String logoText, String srcImgPath,
                    String targerPath) {
    markImageByText(logoText, srcImgPath, targerPath, null);
  } 

  /**
   * 给图片添加水印文字、可设置水印文字的旋转角度
   *
   * @param logoText
   * @param srcImgPath
   * @param targerPath
   * @param degree
   */
  public void markImageByText(String logoText, String srcImgPath,
                    String targerPath, Integer degree) { 

    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); 

      // 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); 

      System.out.println("图片完成添加水印文字"); 

    } 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();
      }
    }
  } 

  /*********** 动图加水印 ************/ 

  /**
   * 缩放gif图片,直接传的File文件,可设置宽和高
   */
  public void makeGif(File src, File dest, int width, int height) throws IOException {
      GifImage gifImage = GifDecoder.decode(src);// 创建一个GifImage对象.
      GifImage resizeIMG = GifTransformer.resize(gifImage, width, height, true);
      GifEncoder.encode(resizeIMG, dest);
    }
   //缩放gif图片,直接传文件路径,可设置宽和高
  public void makeGif(String src, String dest, int width, int height) throws IOException {
    GifImage gifImage = GifDecoder.decode(new File(src));// 创建一个GifImage对象.
    makeGif(new File(src), new File(dest), gifImage.getScreenWidth() / 2,
        gifImage.getScreenHeight() / 2); 

  }
   //缩放gif图片,传文件File文件,不可设置宽和高
  public void makeGif(File src, File dest) throws IOException {
    GifImage gifImage = GifDecoder.decode(src);// 创建一个GifImage对象.
    makeGif(src, dest, gifImage.getScreenWidth() / 2, gifImage.getScreenHeight() / 2);
  }
   //缩放gif图片,传文件路径,不可设置宽和高
  public void makeGif(String src, String dest) throws IOException {
    makeGif(new File(src), new File(dest));
  } 

  /**
   * 动图中加文字水印
   */
  public void addTextWatermarkToGif(File src, String watermarkText, File dest)throws IOException {
    //水印初始化、设置(字体、样式、大小、颜色)
    TextPainter textPainter = new TextPainter(new Font("黑体", Font.ITALIC, 12));
    textPainter.setOutlinePaint(Color.WHITE);
    BufferedImage renderedWatermarkText = textPainter.renderString(watermarkText, true);
    //图片对象
    GifImage gf = GifDecoder.decode(src);
    //获取图片大小
    int iw = gf.getScreenWidth();
    int ih = gf.getScreenHeight();
    //获取水印大小
      int tw = renderedWatermarkText.getWidth();
    int th = renderedWatermarkText.getHeight();
    //水印位置
    Point p = new Point();
    p.x = iw - tw - 5;
    p.y = ih - th - 4;
      //加水印
    Watermark watermark = new Watermark(renderedWatermarkText, p);
    gf = watermark.apply(GifDecoder.decode(src), true);
    //输出
    GifEncoder.encode(gf, dest);
  } 

  /**
   * 动图中加图片水印
   */
  public void addImageWatermarkToGif(File src, String watermarkPath, File dest){ 

    try{ 

      BufferedImage renderedWatermarkText = ImageIO.read(new File(watermarkPath)); 

      //图片对象
      GifImage gf = GifDecoder.decode(src); 

      //获取图片大小
      int iw = gf.getScreenWidth();
      int ih = gf.getScreenHeight(); 

      //获取水印大小
      int tw = renderedWatermarkText.getWidth();
      int th = renderedWatermarkText.getHeight(); 

      //水印位置
      Point p = new Point();
      p.x = iw-tw-20;
      p.y = ih-th-20; 

      //加水印
      Watermark watermark = new Watermark(renderedWatermarkText, p);
      //水印透明度
      watermark.setTransparency(1);
      gf = watermark.apply(GifDecoder.decode(src), false);
      //输出
      GifEncoder.encode(gf, dest);
    } catch (IOException e){
      e.printStackTrace();
    }
  }  

  public static void main(String[] args) {
    //需要加水印图片的路径
    String srcImgPath = "d:/1.jpg";
    String logoText = "复 印 无 效";
    //图片水印的路径
    String iconPath = "d:/2.jpg"; 

     //添加完水印文件的输出路径
    String targerTextPath = "d:/qie_text.jpg";
    String targerTextPath2 = "d:/qie_text_rotate.jpg";
    String targerIconPath = "d:/qie_icon.jpg";
    String targerIconPath2 = "d:/qie_icon_rotate.jpg"; 

    System.out.println("给图片添加水印文字开始...");
    // 给图片添加水印文字
    markImageByText(logoText, srcImgPath, targerTextPath);
    // 给图片添加水印文字,水印文字旋转-45
    markImageByText(logoText, srcImgPath, targerTextPath2, -45);
    System.out.println("给图片添加水印文字结束..."); 

    System.out.println("给图片添加水印图片开始...");
    setImageMarkOptions(0.3f, 1, 1, null, null);
     // 给图片添加水印图片
    markImageByIcon(iconPath, srcImgPath, targerIconPath);
    // 给图片添加水印图片,水印图片旋转-45
    markImageByIcon(iconPath, srcImgPath, targerIconPath2, -45);
    System.out.println("给图片添加水印图片结束..."); 

    //动图添加水印(添加水印动图文件,添加的水印,添加完输出文件)
    addTextWatermarkToGif(new File("d:\\10.gif"), "复 印 无 效", new File("d:\\11.gif"));
    addImageWatermarkToGif(new File("d:\\gif\\10.gif"), "d:\\gif\\3.png", new File("d:\\gif\\4.gif"));
  }
}

这里面有普通图片添加水印和动图添加水印,普通图片添加水印方法如果传的是动图能添加成功,但是动图就成静态的了,动图添加水印方法如果传的是普通图片,会直接报错了。

这些我在做的时候都有试过,现在就当记笔记记录在此,也希望能帮助到有需要的兄弟。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

您可能感兴趣的文章:

  • Java实现给图片添加图片水印,文字水印及马赛克的方法示例
  • JAVA图片水印开发案例详解
  • 利用java批量给pdf加水印的方法示例
  • java实现倾斜水印铺满整张图
  • java实现图片上加文字水印(SpringMVC + Jsp)
  • java图片添加水印实例代码分享
  • 如何使用JAVA实现数字水印
  • 简单的java图片处理类(图片水印 图片缩放)
  • java.imageIo给图片添加水印的实现代码
  • java 图片加水印实例代码
(0)

相关推荐

  • java.imageIo给图片添加水印的实现代码

    复制代码 代码如下: package com.blogs.image;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.io.File;impor

  • 利用java批量给pdf加水印的方法示例

    前言 最近因为工作需要,要批量在pdf上加水印,但找了一圈pdf在mac下的水印工具,都不太好用,索性就用java写一个吧. 以下代码依赖itext5.3.3包,java操作pdf 依靠itext5.3.3. 示例代码 //读取原来的pdf PdfReader reader = new PdfReader("/test/" + "1.pdf"); //生成以后的pdf PdfStamper stamp = new PdfStamper(reader, new Fil

  • JAVA图片水印开发案例详解

    写在最前面 上周零零碎碎花了一周的时间研究水印的开发,现在终于写了个入门级的Demo,做下笔记同时分享出来供大家参考. Demo是在我上次写的 JAVA实用案例之文件导入导出(POI方式) 框架基础上搭建的,基于Spring+SpringMVC.如果有错误还请大家指正. 最后源码地址在:https://github.com/allanzhuo/myport.git . 简单介绍 水印开发是web开发中一种比较常见的功能,实现的代码很简单,具体的实现步骤我也会以代码为基础详细讲述.其实以我个人的理

  • java图片添加水印实例代码分享

    本文为大家介绍了java图片添加水印实例代码,java实现水印还是非常方便的,水印可以是图片或者文字,具体内容如下 package michael.io.image; import java.awt.AlphaComposite; import java.awt.Graphics2D; import java.awt.Image; import java.awt.RenderingHints; import java.awt.image.BufferedImage; import java.io

  • Java实现给图片添加图片水印,文字水印及马赛克的方法示例

    本文实例讲述了Java实现给图片添加图片水印,文字水印及马赛克的方法.分享给大家供大家参考,具体如下: 可以在eclipse中新建个Utils类,把以下代码复制进去直接使用,以下方法实现单个或多个水印的添加 package com.rzxt.fyx.common.util; import java.awt.AlphaComposite; import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import

  • 如何使用JAVA实现数字水印

    数字水印有可见不可见之分,可见的比如课件上印有学校校徽,微博发图片会水印上上传者的信息及微博logo等. 用java实现可见的数字水印,草人主要是用到了java.awt包中的AlphaComposite类,当然在实现之前先介绍一下AlphaComposite类: AlphaComposite类是关于两个目标重叠的混合处理类,此类实现的特定规则是 T. Porter 和 T. Duff 合著的 "Compositing Digital Images", SIGGRAPH 84, 253-

  • java 图片加水印实例代码

    复制代码 代码如下: try {            String targetImg = "D:/Blue hills.jpg";//          String pressImg = "D:/20130311220300.jpg";            String pressImg = "D:/html_original.jpg"; File f1 = new File(targetImg);            Image sr

  • java实现图片上加文字水印(SpringMVC + Jsp)

    看之前要先对SpringMVC进行了解打好基础,下面直接先看效果图 代码编写 1.导入相关架包 2.配置文件 web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee"

  • java实现倾斜水印铺满整张图

    今天遇到一个需求对上传的图铺满水印,在网上找了半天都是在指定位置设置水印,下面代码是我通过在网上找的代码,然后改造而成的.我们先看一下效果图 下面讲实现方法: 第一步:使用ps或美图软件设计水印图片,比如: 第二步:把下面代码放入类中: package org.platform.framework.commons.util; import java.awt.AlphaComposite; import java.awt.Color; import java.awt.Font; import ja

  • 简单的java图片处理类(图片水印 图片缩放)

    复制代码 代码如下: import java.awt.AlphaComposite;import java.awt.Color;import java.awt.Font;import java.awt.Graphics;import java.awt.Graphics2D;import java.awt.Image;import java.awt.Toolkit;import java.awt.color.ColorSpace;import java.awt.geom.AffineTransfo

随机推荐