工具类

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import javax.imageio.ImageIO;

import java.awt.*;

import java.awt.font.TextAttribute;

import java.awt.image.BufferedImage;

import java.io.IOException;

import java.io.OutputStream;

import java.text.AttributedCharacterIterator;

import java.text.AttributedString;

/**

* Java生成水印文字(可以改造成生成图片的水印文字,生成图片的水印图片)

* Created by wesley on 2017-11-02.

*/

public class ImageUtil {

private static final Logger logger = LoggerFactory.getLogger(ImageUtil.class);

// 宽度

private static final int WIDTH = 360;

// 高度

private static final int HEIGHT = 140;

// 水印透明度

private static float alpha = 1.0f;

// 水印横向位置

private static int positionWidth = 80;

// 水印纵向位置

private static int positionHeight = 30;

// 水印文字字体

private static Font font = new Font("PingFang SC Regular", Font.PLAIN, 44);

// 水印文字颜色

private static Color color = new Color(230, 230, 230);

/**

* 创建背景白色的单水印图片

* @param os

* @param text

* @throws IOException

*/

public static void createSingleWaterMarkImage(OutputStream os, String text) throws IOException {

GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();

String script[] = ge.getAvailableFontFamilyNames();

for(String s:script){

logger.info("字体有:{}",s);

}

// 1.创建空白图片

BufferedImage image = new BufferedImage(

WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);

// 2.获取图片画笔

Graphics2D g = image.createGraphics();

// 3.设置画笔颜色

g.setColor(Color.white);

// 4.绘制矩形背景

g.fillRect(0, 0, WIDTH, HEIGHT);

// 5.绘制矩形边框

g.setColor(Color.lightGray);

g.drawRect(0, 0, WIDTH - 10, HEIGHT - 10);

// 添加水印文字

// 6、处理文字

AttributedString ats = new AttributedString(text);

ats.addAttribute(TextAttribute.FONT, font, 0, text.length());

AttributedCharacterIterator iter = ats.getIterator();

// 7、设置对线段的锯齿状边缘处理

g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);

g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

// 8、设置水印旋转

g.rotate(Math.toRadians(-15), (double) image.getWidth() / 2, (double) image.getHeight() / 2);

// 9、设置水印文字颜色

g.setColor(color);

// 10、设置水印文字Font

g.setFont(font);

// 11、设置水印文字透明度

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

g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER));

// 12、水印位置

g.drawString(iter, positionHeight, positionWidth);

// 13、释放资源

g.dispose();

ImageIO.write(image, "JPG", os);

logger.info("打印水印成功...");

}

/**

* 创建多水印图片

* @param os

* @param text

* @throws IOException

*/

public static void createMoreWaterMarkImage(OutputStream os, String text) throws IOException {

GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();

String script[] = ge.getAvailableFontFamilyNames();

for(String s:script){

logger.info("字体有:{}",s);

}

// 1.创建空白图片

BufferedImage image = new BufferedImage(

WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);

// 2.获取图片画笔

Graphics2D g = image.createGraphics();

// 3.设置画笔颜色

g.setColor(Color.white);

// 4.绘制矩形背景

g.fillRect(0, 0, WIDTH, HEIGHT);

// 5.绘制矩形边框

g.setColor(Color.lightGray);

g.drawRect(0, 0, WIDTH - 10, HEIGHT - 10);

// 添加水印文字

// 6、设置对线段的锯齿状边缘处理

g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);

g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

// 7、设置水印旋转

g.rotate(Math.toRadians(-15), (double) image.getWidth() / 2, (double) image.getHeight() / 2);

// 8、设置水印文字颜色

g.setColor(color);

// 9、设置水印文字Font

g.setFont(font);

// 10、设置水印文字透明度

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

g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER));

// 11、水印位置

// 计算水印位置方法一

for (int height = -WIDTH/2 ; height < 1.5*HEIGHT; height = height + 2*font.getSize()) {

for (int weight = -HEIGHT/2 ; weight < 1.5*WIDTH; weight = weight + 25*getTextLength(text)) {

g.drawString(text, weight, height);

}

}

// 计算水印位置方式二

// int x = -WIDTH/2;

// int y = -HEIGHT/2;

// while(x

// y = -HEIGHT/2;

// while(y

// //添加水印效果 第一参数->设置的内容,后面两个参数->文字在图片上的坐标位置(x,y)

// g.drawString(text, x, y);//y保证至少可以显示一个水印的高度

// y +=font.getSize()+50;//100为间隔值,即每个水印之间的间隔

// }

// x +=font.getSize()*getTextLength(text)+50;

// }

// 12、释放资源

g.dispose();

ImageIO.write(image, "JPG", os);

logger.info("打印水印成功...");

}

//获取文本长度

public static int getTextLength(String text) {

int length = text.length();//获取所有文本的长度

for (int i = 0; i < text.length(); i++) {

String s = String.valueOf(text.charAt(i));//获取指定的字符

if (s.getBytes().length > 1) {//字节长度大于1,说明是中文,那么需要延长文本长度

length++;

}

}

//计算总共有多少个字节,也就是有多少个字

length = (length % 2 == 0) ? length / 2 : length / 2 + 1;

return length;

}

/**

* 创建背景透明图片

*

* @param os

* @param text

* @throws IOException

*/

public static void createTransparentImage(OutputStream os, String text) throws IOException {

// 创建空白图片

BufferedImage image = new BufferedImage(

WIDTH, HEIGHT, BufferedImage.TYPE_INT_ARGB);

// 获取图片画笔

Graphics2D g = image.createGraphics();

// 设置背景透明度

image = g.getDeviceConfiguration().createCompatibleImage(WIDTH, HEIGHT, Transparency.TRANSLUCENT);

g.dispose();

g = image.createGraphics();

// 设置对线段的锯齿状边缘处理

// g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);

g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

// 文字处理

AttributedString ats = new AttributedString(text);

ats.addAttribute(TextAttribute.FONT, font, 0, text.length());

AttributedCharacterIterator iter = ats.getIterator();

// 水印旋转

g.rotate(Math.toRadians(-15), (double) image.getWidth() / 2, (double) image.getHeight() / 2);

// 设置水印文字颜色

g.setColor(color);

// 设置水印文字Font

g.setFont(font);

// 设置水印文字透明度

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

// 设置水印文字透明度结束

g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER));

// 水印位置

g.drawString(iter, positionHeight, positionWidth);

// 释放资源

g.dispose();

ImageIO.write(image, "PNG", os);

}

}

controller中使用:

/**

* 生成文字水印图片

*

* @param response

* @param staffNo

*/

@RequestMapping("/getImage/")

public void getImage(HttpServletResponse response) {

response.setContentType("image/*");

try {

OutputStream os = response.getOutputStream();

String text = “测试水印文字图片”;

logger.info("需要打印的水印文字:{}",text);

ImageUtil.createTransparentImage(os, text);

} catch (IOException e) {

logger.error("打印水印异常...");

}

}

效果图:

java 生成水印_Java生成文字水印相关推荐

  1. 生成高清缩略图; 添加图片、文字水印; 图片、文字水印透明

    之前写了一个公共的ImgHelper类,主要提供高清晰缩略图生成,由于在之前的实际操作过程中存在一些问题,最近有了点时间,于是重新拾起来再改进一下,顺便研究一下GDI+. 问题一:产品搜索列表展示,每 ...

  2. Java分享--给图片添加文字水印(文字可旋转)

    这篇文章主要介绍了Java实现给图片添加文字水印,文字水印的方法,涉及java针对图片的读取.水印添加设置等相关操作技巧,需要的朋友可以参考下 . 很多时候项目中的图片需要一定的版权,就是人家拿出去用 ...

  3. java 图片水印_JAVA实现图片水印

    一.JAVA图片水印实现原理 1.1.JAVA图片水印实现思路 1.创建缓存图片对象. 2.创建Java绘图工具对象. 3.使用绘图工具对象将原图绘制到缓存图片对象. 4.使用绘图工具将水印(文字/图 ...

  4. java实现清除图片水印_Java实现图片水印

    publicfinalclassImageUtils {publicImageUtils() { }publicfinalstaticString getPressImgPath() {returnA ...

  5. 用Java实现给图片添加文字水印

    程序背景 在网络中的很多地方都有水印的存在,比如微信公众号上面的图片,微博,以及这个CSDN博客上面的图片--所以突发奇想,看看自己能否写一个可以给图片添加水印的工具类. 程序代码 package i ...

  6. android 多行文字水印,android实现文字水印效果 支持多行水印

    特点 支持多行水印,支持自定义角度,支持自定义文字大小. 原理: 使用一个TextView 占据整个页面.在TextView基础上面打水印. 用法: 具体的view在 package cn.fulus ...

  7. java 字符串 内存_java – 字符串文字和永久生成内存区域

    当我们说实际的字符串存储在永久生成区域中时,同样适用于字符串文字?或者只是被inter()所拘留的字符串? 实际上,博客文章通常表示,字符串池包含对字符串对象的引用,而实际的字符串对象是堆中的某个位置 ...

  8. java如何给pdf加水印_java pdf加水印的方法

    本文实例为大家分享了java pdf加水印的具体代码,供大家参考,具体内容如下 引入依赖 com.itextpdf.tool xmlworker 5.5.10 com.itextpdf itextpd ...

  9. java word插件开发_java生成word的几种方案

    1. Jacob是Java-COM Bridge的缩写,它在Java与微软的COM组件之间构建一座桥梁.使用Jacob自带的DLL动态链接库,并通过JNI的方式实现了在Java平台上对COM程序的调用 ...

  10. java生成表_java生成表格图表

    项目有个需求是生成上图的表格图表,本来excel很容易生成上边的表格图,但是java poi不支持在服务器端把excel表格导出成图片,在没有找到合适的工具库下,用java 2d实现同样图表. 这个表 ...

最新文章

  1. 2015c语言成绩查询,2015年3月全国计算机二级C语言选择第1套
  2. python数字处理技巧(2): Numpy、矩阵运算、随机、字符串日期
  3. C++STL常用拷贝和替换算法
  4. Bzoj 3343: 教主的魔法(分块+二分答案)
  5. 牛客多校10 - Tournament(找规律)
  6. 参加浙江中医药大学第十二届程序设计竞赛(ACM赛制)的小记
  7. spring的service不启动事务的配置。
  8. 大数据认知计算在内容安全管控中的应用
  9. 根本无处可避的广东三游
  10. JavaScript——模块化的历史进程梳理
  11. XenCenter开启虚机提示VDI不可用
  12. 「企业架构」TOGAF的权威指南
  13. 诺兰模型与信息化建设阶段分析
  14. 跟着团子学SAP PS:SAP PS模块常用报表介绍及增强建议
  15. 再更新:2022 京东/淘宝双11活动一键自动完成任务脚本app来了,顺便说个事情...
  16. 云原生CICD:Tekton之TaskTaskRun概念篇
  17. Qt label使用html样式设置文字
  18. 如何从Vant Weapp、MinUI、iView Weapp、Wux Weapp、ColorUI共5个小程序组件库选型 转载
  19. 如何去除PDF的水印?【9种方法总结】
  20. 在树莓派上安装mqtt客户端

热门文章

  1. 怎样网上赚钱最快方法有哪些?IP打造是关键
  2. 关闭appleid双重认证_如何查看并移除登陆过Apple ID的设备
  3. 守望先锋等FPS游戏的网络同步
  4. 【见闻录系列】浅谈搜索系统与推荐系统的一点区别
  5. 如何利用PS做文字拼接海报
  6. JavaScript实现动态显示时间
  7. linux使用定时器回调函数示例
  8. 高德地图打包后不能使用,高德导航View不显示,高德地图导航组件黑屏的问题;
  9. 也评 阿里 P10 赵海平对王垠的面试
  10. 论文阅读笔记:Weakly-supervised Semantic Segmentation in Cityscape via Hyperspectral Image