欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2023-12-04 10:46:22
本文实例讲述了java实现给图片添加图片水印,文字水印及马赛克的方法。分享给大家供大家参考,具体如下: 可以在eclipse中新建个utils类,把以下代码复制进去直接使...

本文实例讲述了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.awt.image;
import java.awt.renderinghints;
import java.awt.image.bufferedimage;
import java.io.file;
import javax.imageio.imageio;
import javax.swing.imageicon;
/**
 * 给图片添加水印
 * @author tgy
 *
 */
public class markimageutils {
  /**
   * @param args
   */
  public static void main(string[] args) {
  string output = "f:/images/";
    string source = "f:/images/6.jpg";  //源图片路径
    string icon = "f:/images/icon2.png"; //覆盖图片路径
    string imagename = "mark_image"; //图片名称
    string imagetype = "jpg"; //图片类型jpg,jpeg,png,gif
    string text = "加水印了";
    int size = 4;  //马赛克大小
    integer degree = null; //水印旋转角度-45,null表示不旋转
    string result = null;
    //给图片添加图片水印
    result = markimageutils.markimagebymoreicon(icon,source,output,imagename,imagetype,degree);
//    result = markimageutils.markimagebysingleicon(icon, source, output, imagename, imagetype, degree);
//    //给图片添加文字水印
//    result = markimageutils.markimagebymoretext(source,output,imagename,imagetype,color.red,text,degree);
//    result = markimageutils.markimagebysingletext(source,output,imagename,imagetype,color.red,text,degree);
//    //给图片打马赛克
//    result = markimageutils.markimagebymosaic(source,output,imagename,imagetype,size);
    system.out.println(result);
  }
/**
   * 给图片不同位置添加多个图片水印、可设置水印图片旋转角度
   * @param icon 水印图片路径(如:f:/images/icon.png)
   * @param source 没有加水印的图片路径(如:f:/images/6.jpg)
   * @param output 加水印后的图片路径(如:f:/images/)
   * @param imagename 图片名称(如:11111)
   * @param imagetype 图片类型(如:jpg)
   * @param degree 水印图片旋转角度,为null表示不旋转
   */
  public static string markimagebymoreicon(string icon,string source,string output,string imagename,string imagetype,integer degree) {
    string result = "添加图片水印出错";
    try {
    file file = new file(source);
    file ficon = new file(icon);
    if (!file.isfile()) {
      return source + " 不是一个图片文件!";
    }
      //将icon加载到内存中
      image ic = imageio.read(ficon);
      //icon高度
      int icheight = ic.getheight(null);
      //将源图片读到内存中
      image img = imageio.read(file);
      //图片宽
      int width = img.getwidth(null);
      //图片高
      int height = img.getheight(null);
      bufferedimage bi = new bufferedimage(width,height,bufferedimage.type_int_rgb);
      //创建一个指定 bufferedimage 的 graphics2d 对象
      graphics2d g = bi.creategraphics();
      //x,y轴默认是从0坐标开始
      int x = 0;
      int y = 0;
      //默认两张水印图片的间隔高度是水印图片的1/3
      int temp = icheight/3;
      int space = 1;
      if(height>=icheight){
      space = height/icheight;
      if(space>=2){
      temp = y = icheight/2;
      if(space==1||space==0){
      x = 0;
      y = 0;
      }
      }
      }else{
      x = 0;
      y = 0;
      }
      //设置对线段的锯齿状边缘处理
      g.setrenderinghint(renderinghints.key_interpolation,renderinghints.value_interpolation_bilinear);
      //呈现一个图像,在绘制前进行从图像空间到用户空间的转换
      g.drawimage(img.getscaledinstance(width,height,image.scale_smooth),0,0,null);
      for(int i=0;i<space;i++){
      if (null != degree) {
        //设置水印旋转
        g.rotate(math.toradians(degree),(double) bi.getwidth() / 2, (double) bi.getheight() / 2);
      }
      //水印图象的路径 水印一般为gif或者png的,这样可设置透明度
      imageicon imgicon = new imageicon(icon);
      //得到image对象。
      image con = imgicon.getimage();
      //透明度,最小值为0,最大值为1
      float clarity = 0.6f;
      g.setcomposite(alphacomposite.getinstance(alphacomposite.src_atop,clarity));
      //表示水印图片的坐标位置(x,y)
      //g.drawimage(con, 300, 220, null);
      g.drawimage(con, x, y, null);
      g.setcomposite(alphacomposite.getinstance(alphacomposite.src_over));
      y+=(icheight+temp);
      }
      g.dispose();
      file sf = new file(output, imagename+"."+imagetype);
    imageio.write(bi, imagetype, sf); // 保存图片
      result = "图片完成添加icon水印";
    } catch (exception e) {
      e.printstacktrace();
    }
    return result;
  }
/**
   * 给图片添加单个图片水印、可设置水印图片旋转角度
   * @param icon 水印图片路径(如:f:/images/icon.png)
   * @param source 没有加水印的图片路径(如:f:/images/6.jpg)
   * @param output 加水印后的图片路径(如:f:/images/)
   * @param imagename 图片名称(如:11111)
   * @param imagetype 图片类型(如:jpg)
   * @param degree 水印图片旋转角度,为null表示不旋转
   */
  public static string markimagebysingleicon(string icon,string source,string output,string imagename,string imagetype,integer degree) {
    string result = "添加图片水印出错";
    try {
    file file = new file(source);
    file ficon = new file(icon);
    if (!file.isfile()) {
      return source + " 不是一个图片文件!";
    }
      //将icon加载到内存中
      image ic = imageio.read(ficon);
      //icon高度
      int icheight = ic.getheight(null);
      //将源图片读到内存中
      image img = imageio.read(file);
      //图片宽
      int width = img.getwidth(null);
      //图片高
      int height = img.getheight(null);
      bufferedimage bi = new bufferedimage(width,height,bufferedimage.type_int_rgb);
      //创建一个指定 bufferedimage 的 graphics2d 对象
      graphics2d g = bi.creategraphics();
      //x,y轴默认是从0坐标开始
      int x = 0;
      int y = (height/2)-(icheight/2);
      //设置对线段的锯齿状边缘处理
      g.setrenderinghint(renderinghints.key_interpolation,renderinghints.value_interpolation_bilinear);
      //呈现一个图像,在绘制前进行从图像空间到用户空间的转换
      g.drawimage(img.getscaledinstance(width,height,image.scale_smooth),0,0,null);
      if (null != degree) {
        //设置水印旋转
        g.rotate(math.toradians(degree),(double) bi.getwidth() / 2, (double) bi.getheight() / 2);
      }
      //水印图象的路径 水印一般为gif或者png的,这样可设置透明度
      imageicon imgicon = new imageicon(icon);
      //得到image对象。
      image con = imgicon.getimage();
      //透明度,最小值为0,最大值为1
      float clarity = 0.6f;
      g.setcomposite(alphacomposite.getinstance(alphacomposite.src_atop,clarity));
      //表示水印图片的坐标位置(x,y)
      //g.drawimage(con, 300, 220, null);
      g.drawimage(con, x, y, null);
      g.setcomposite(alphacomposite.getinstance(alphacomposite.src_over));
      g.dispose();
      file sf = new file(output, imagename+"."+imagetype);
    imageio.write(bi, imagetype, sf); // 保存图片
      result = "图片完成添加icon水印";
    } catch (exception e) {
      e.printstacktrace();
    }
    return result;
  }
  /**
   * 给图片添加多个文字水印、可设置水印文字旋转角度
   * @param source 需要添加水印的图片路径(如:f:/images/6.jpg)
   * @param output 添加水印后图片输出路径(如:f:/images/)
   * @param imagename 图片名称(如:11111)
   * @param imagetype 图片类型(如:jpg)
   * @param color 水印文字的颜色
   * @param word 水印文字
   * @param degree 水印文字旋转角度,为null表示不旋转
   */
  public static string markimagebymoretext(string source,string output,string imagename,string imagetype,color color,string word,integer degree) {
    string result = "添加文字水印出错";
  try {
      //读取原图片信息
      file file = new file(source);
      if (!file.isfile()) {
      return file + " 不是一个图片文件!";
    }
      image img = imageio.read(file);
      //图片宽
      int width = img.getwidth(null);
      //图片高
      int height = img.getheight(null);
      //文字大小
      int size = 50;
      //加水印
      bufferedimage bi = new bufferedimage(width, height, bufferedimage.type_int_rgb);
      graphics2d g = bi.creategraphics();
      g.drawimage(img, 0, 0, width, height, null);
      //设置水印字体样式
      font font = new font("宋体", font.plain, size);
      //根据图片的背景设置水印颜色
      g.setcolor(color);
      int x = width/3;
      int y = size;
      int space = height/size;
      for(int i=0;i<space;i++){
      //如果最后一个坐标的y轴比height高,直接退出
      if((y+size)>height){
      break;
      }
      if (null != degree) {
        //设置水印旋转
        g.rotate(math.toradians(degree),(double) bi.getwidth() / 2, (double) bi.getheight() / 2);
      }
      g.setfont(font);
      //水印位置
      g.drawstring(word, x, y);
      y+=(2*size);
      }
      g.dispose();
      //输出图片
      file sf = new file(output, imagename+"."+imagetype);
    imageio.write(bi, imagetype, sf); // 保存图片
      result = "图片完成添加word水印";
    } catch (exception e) {
      e.printstacktrace();
    }
  return result;
  }
  /**
   * 给图片添加单个文字水印、可设置水印文字旋转角度
   * @param source 需要添加水印的图片路径(如:f:/images/6.jpg)
   * @param output 添加水印后图片输出路径(如:f:/images/)
   * @param imagename 图片名称(如:11111)
   * @param imagetype 图片类型(如:jpg)
   * @param color 水印文字的颜色
   * @param word 水印文字
   * @param degree 水印文字旋转角度,为null表示不旋转
   */
  public static string markimagebysingletext(string source,string output,string imagename,string imagetype,color color,string word,integer degree) {
    string result = "添加文字水印出错";
  try {
      //读取原图片信息
      file file = new file(source);
      if (!file.isfile()) {
      return file + " 不是一个图片文件!";
    }
      image img = imageio.read(file);
      int width = img.getwidth(null);
      int height = img.getheight(null);
      //加水印
      bufferedimage bi = new bufferedimage(width, height, bufferedimage.type_int_rgb);
      graphics2d g = bi.creategraphics();
      g.drawimage(img, 0, 0, width, height, null);
      //设置水印字体样式
      font font = new font("宋体", font.plain, 50);
      //根据图片的背景设置水印颜色
      g.setcolor(color);
      if (null != degree) {
        //设置水印旋转
        g.rotate(math.toradians(degree),(double) bi.getwidth() / 2, (double) bi.getheight() / 2);
      }
      g.setfont(font);
      int x = width/3;
      int y = height/2;
      //水印位置
      g.drawstring(word, x, y);
      g.dispose();
      //输出图片
      file sf = new file(output, imagename+"."+imagetype);
    imageio.write(bi, imagetype, sf); // 保存图片
      result = "图片完成添加word水印";
    } catch (exception e) {
      e.printstacktrace();
    }
  return result;
  }
  /**
   * 给图片加马赛克
   * @param source 原图片路径(如:f:/images/6.jpg)
   * @param output 打马赛克后,图片保存的路径(如:f:/images/)
   * @param imagename 图片名称(如:11111)
   * @param imagetype 图片类型(如:jpg)
   * @param size 马赛克尺寸,即每个矩形的宽高
   * @return
   */
  public static string markimagebymosaic(string source,string output,string imagename,string imagetype,int size){
  string result = "图片打马赛克出错";
  try{
    file file = new file(source);
    if (!file.isfile()) {
      return file + " 不是一个图片文件!";
    }
    bufferedimage img = imageio.read(file); // 读取该图片
    int width = img.getwidth(null); //原图片宽
      int height = img.getheight(null); //原图片高
    bufferedimage bi = new bufferedimage(width,height, bufferedimage.type_int_rgb);
    //马赛克格尺寸太大或太小
    if (width < size || height < size) {
      return "马赛克格尺寸太大";
    }
    if(size<=0){
     return "马赛克格尺寸太小";
    }
    int xcount = 0; //x方向绘制个数
    int ycount = 0; //y方向绘制个数
    if (width % size == 0) {
      xcount = width / size;
    } else {
      xcount = width / size + 1;
    }
    if (height % size == 0) {
      ycount = height / size;
    } else {
      ycount = height / size + 1;
    }
    int x = 0; //x坐标
    int y = 0;
//y坐标
    //绘制马赛克(绘制矩形并填充颜色)
    graphics2d g = bi.creategraphics();
    for (int i = 0; i < xcount; i++) {
      for (int j = 0; j < ycount; j++) {
        //马赛克矩形格大小
        int mwidth = size;
        int mheight = size;
        if(i==xcount-1){  //横向最后一个不够一个size
          mwidth = width-x;
        }
        if(j == ycount-1){ //纵向最后一个不够一个size
          mheight = height-y;
        }
        //矩形颜色取中心像素点rgb值
        int centerx = x;
        int centery = y;
        if (mwidth % 2 == 0) {
          centerx += mwidth / 2;
        } else {
          centerx += (mwidth - 1) / 2;
        }
        if (mheight % 2 == 0) {
          centery += mheight / 2;
        } else {
          centery += (mheight - 1) / 2;
        }
        color color = new color(img.getrgb(centerx, centery));
        g.setcolor(color);
        g.fillrect(x, y, mwidth, mheight);
        y = y + size;// 计算下一个矩形的y坐标
      }
      y = 0;// 还原y坐标
      x = x + size;// 计算x坐标
    }
    g.dispose();
    file sf = new file(output, imagename+"."+imagetype);
    imageio.write(bi, imagetype, sf); // 保存图片
    result = "打马赛克成功";
  }catch(exception e){
  e.printstacktrace();
  }
    return result;
  }
}

更多java相关内容感兴趣的读者可查看本站专题:《java图片操作技巧汇总》、《java日期与时间操作技巧汇总》、《java操作dom节点技巧总结》、《java文件与目录操作技巧汇总》及《java数据结构与算法教程》。

希望本文所述对大家java程序设计有所帮助。