java 生成水印_Java生成文字水印
工具类
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生成文字水印相关推荐
- 生成高清缩略图; 添加图片、文字水印; 图片、文字水印透明
之前写了一个公共的ImgHelper类,主要提供高清晰缩略图生成,由于在之前的实际操作过程中存在一些问题,最近有了点时间,于是重新拾起来再改进一下,顺便研究一下GDI+. 问题一:产品搜索列表展示,每 ...
- Java分享--给图片添加文字水印(文字可旋转)
这篇文章主要介绍了Java实现给图片添加文字水印,文字水印的方法,涉及java针对图片的读取.水印添加设置等相关操作技巧,需要的朋友可以参考下 . 很多时候项目中的图片需要一定的版权,就是人家拿出去用 ...
- java 图片水印_JAVA实现图片水印
一.JAVA图片水印实现原理 1.1.JAVA图片水印实现思路 1.创建缓存图片对象. 2.创建Java绘图工具对象. 3.使用绘图工具对象将原图绘制到缓存图片对象. 4.使用绘图工具将水印(文字/图 ...
- java实现清除图片水印_Java实现图片水印
publicfinalclassImageUtils {publicImageUtils() { }publicfinalstaticString getPressImgPath() {returnA ...
- 用Java实现给图片添加文字水印
程序背景 在网络中的很多地方都有水印的存在,比如微信公众号上面的图片,微博,以及这个CSDN博客上面的图片--所以突发奇想,看看自己能否写一个可以给图片添加水印的工具类. 程序代码 package i ...
- android 多行文字水印,android实现文字水印效果 支持多行水印
特点 支持多行水印,支持自定义角度,支持自定义文字大小. 原理: 使用一个TextView 占据整个页面.在TextView基础上面打水印. 用法: 具体的view在 package cn.fulus ...
- java 字符串 内存_java – 字符串文字和永久生成内存区域
当我们说实际的字符串存储在永久生成区域中时,同样适用于字符串文字?或者只是被inter()所拘留的字符串? 实际上,博客文章通常表示,字符串池包含对字符串对象的引用,而实际的字符串对象是堆中的某个位置 ...
- java如何给pdf加水印_java pdf加水印的方法
本文实例为大家分享了java pdf加水印的具体代码,供大家参考,具体内容如下 引入依赖 com.itextpdf.tool xmlworker 5.5.10 com.itextpdf itextpd ...
- java word插件开发_java生成word的几种方案
1. Jacob是Java-COM Bridge的缩写,它在Java与微软的COM组件之间构建一座桥梁.使用Jacob自带的DLL动态链接库,并通过JNI的方式实现了在Java平台上对COM程序的调用 ...
- java生成表_java生成表格图表
项目有个需求是生成上图的表格图表,本来excel很容易生成上边的表格图,但是java poi不支持在服务器端把excel表格导出成图片,在没有找到合适的工具库下,用java 2d实现同样图表. 这个表 ...
最新文章
- 2015c语言成绩查询,2015年3月全国计算机二级C语言选择第1套
- python数字处理技巧(2): Numpy、矩阵运算、随机、字符串日期
- C++STL常用拷贝和替换算法
- Bzoj 3343: 教主的魔法(分块+二分答案)
- 牛客多校10 - Tournament(找规律)
- 参加浙江中医药大学第十二届程序设计竞赛(ACM赛制)的小记
- spring的service不启动事务的配置。
- 大数据认知计算在内容安全管控中的应用
- 根本无处可避的广东三游
- JavaScript——模块化的历史进程梳理
- XenCenter开启虚机提示VDI不可用
- 「企业架构」TOGAF的权威指南
- 诺兰模型与信息化建设阶段分析
- 跟着团子学SAP PS:SAP PS模块常用报表介绍及增强建议
- 再更新:2022 京东/淘宝双11活动一键自动完成任务脚本app来了,顺便说个事情...
- 云原生CICD:Tekton之TaskTaskRun概念篇
- Qt label使用html样式设置文字
- 如何从Vant Weapp、MinUI、iView Weapp、Wux Weapp、ColorUI共5个小程序组件库选型 转载
- 如何去除PDF的水印?【9种方法总结】
- 在树莓派上安装mqtt客户端