栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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.awt.Image;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;

public class MarkImageUtils {
  
  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);
  }

  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;iheight){
      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;
  }
  
  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;
  }
  
  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程序设计有所帮助。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/141988.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号