package com.ifudata.common.utils;
import java.awt.AlphaComposite;
import java.awt.BasicStroke;
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.ByteArrayOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* 功能:图片水印工具类
*
* @Date 2022/3/4
* @Version 1.0
*/
public class ImageRemarkUtil {
private static final Logger log = LoggerFactory.getLogger(ImageRemarkUtil.class);
// 水印透明度
private static float alpha = 0.8f;
// 水印横向位置
private static int positionWidth = 100;
// 水印纵向位置
private static int positionHeight = 100;
// 水印文字字体
private static Font font = new Font("宋体", Font.BOLD, 18);
// 水印文字颜色
private static Color color = Color.white;
/**
* @param alpha 水印透明度
* @param positionWidth 水印横向位置
* @param positionHeight 水印纵向位置
* @param font 水印文字字体
* @param color 水印文字颜色
*/
public static void setImageMarkOptions(float alpha, int positionWidth, int positionHeight, Font font, Color color) {
if (alpha != 0.0f)
ImageRemarkUtil.alpha = alpha;
if (positionWidth != 0)
ImageRemarkUtil.positionWidth = positionWidth;
if (positionHeight != 0)
ImageRemarkUtil.positionHeight = positionHeight;
if (font != null)
ImageRemarkUtil.font = font;
if (color != null)
ImageRemarkUtil.color = color;
}
/**
* 给图片添加水印图片
*
* @param iconPath 水印图片路径
* @param srcImgPath 源图片路径
* @param targerPath 目标图片路径
*/
public static void markImageByIcon(String iconPath, String srcImgPath, String targerPath) {
markImageByIcon(iconPath, srcImgPath, targerPath, null);
}
/**
* 给图片添加水印图片、可设置水印图片旋转角度
*
* @param iconPath 水印图片路径
* @param srcImgPath 源图片路径
* @param targerPath 目标图片路径
* @param degree 水印图片旋转角度
*/
public static 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));
// 6、水印图片的位置
g.drawImage(img, positionWidth, positionHeight, null);
g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER));
// 7、释放资源
g.dispose();
// 8、生成图片
os = new FileOutputStream(targerPath);
ImageIO.write(buffImg, "JPG", os);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (null != os)
os.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* 给图片添加水印文字
*
* @param logoText 水印文字
* @param srcImgPath 源图片路径
* @param targerPath 目标图片路径
* @throws IOException
* @throws FileNotFoundException
*/
public static void markImageByText(String logoText, String srcImgPath, String targerPath,double widthRate) throws FileNotFoundException, IOException {
markImageByText(logoText, srcImgPath, targerPath, null, widthRate );
}
/**
* 给网络图片添加水印文字
*
* @param logoText 水印文字
* @param srcImgPath 源图片路径
* @param targerPath 目标图片路径
*/
public static void markNetImageByText(String logoText, String srcImgPath, String targerPath, String watermarkPosition) {
markNetImageByText(logoText, srcImgPath, targerPath, null, watermarkPosition);
}
/**
* 给图片添加水印文字、可设置水印文字的旋转角度
*
* @param logoText 水印文字
* @param srcImgPath 图片地址
* @param targerPath 存放地址
* @param degree 旋转角度
*/
public static void markImageByText(String logoText, String srcImgPath, String targerPath, Integer degree,double widthRate) {
InputStream is = null;
OutputStream os = null;
try {
// 1、源图片
File file = new File(srcImgPath);
Image srcImg = ImageIO.read(file);
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
int size = srcImg.getWidth(null) / 300 * 10;
if (size == 0) {
size = 10;
}
Font font = new Font("宋体", Font.BOLD, size);
g.setFont(font);
// 7、设置水印文字透明度
g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha));
// 8、第一参数->设置的内容,后面两个参数->文字在图片上的坐标位置(x,y)
if(logoText.indexOf("###")>-1){
String[] waterMarkContentList = logoText.split("###");
// 将换行后的文字放入新的集合
int startRow = srcImg.getHeight(null)-waterMarkContentList.length*size*1;
g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, 0.3f));
g.setColor(Color.GRAY);
g.setStroke(new BasicStroke(1f));
g.fillRect(0, startRow-size*2, srcImg.getWidth(null), startRow+size);
// 释放对象 透明度设置结束
g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER));
g.setColor(Color.WHITE);
for (int i = 0; i < waterMarkContentList.length; i++) {
// JLabel label = new JLabel(waterMarkContentList[i]);/*获取自定义水印信息*/
// FontMetrics metrics = label.getFontMetrics(font);
// int waterWidth = metrics.stringWidth(label.getText());//文字水印的宽
// int rowsNumber = waterWidth/;// 图片的高 除以 文字水印的宽 打印的行数(以文字水印的宽为间隔)
// int columnsNumber = width / waterWidth;//图片的宽 除以 文字水印的宽 每行打印的列数(以文字水印的宽为间隔)
//g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, 1.0f));
g.drawString(waterMarkContentList[i], (int)Math.floor(srcImg.getWidth(null)*widthRate), startRow+i*size);//画出水印,并设置水印位置
}
}else{
g.drawString(logoText, (int)Math.floor(buffImg.getWidth()*widthRate), (int)Math.floor(buffImg.getHeight()));
}
// 9、释放资源
g.dispose();
// 10、生成图片
String fileTyle=srcImgPath.substring(srcImgPath.lastIndexOf(".")+1,srcImgPath.length());
ByteArrayOutputStream stream = new ByteArrayOutputStream();
ImageIO.write(buffImg, fileTyle.toUpperCase(), stream);
os = new FileOutputStream(targerPath);
ImageIO.write(buffImg, fileTyle.toUpperCase(), os);
log.info("加水成功");
} catch (Exception e) {
log.error("加水印异常:{}",e);
} finally {
try {
if (null != is)
is.close();
} catch (Exception e) {
e.printStackTrace();
}
try {
if (null != os)
os.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
/*
* 中文转unicode编码
*/
public static String gbEncoding(final String gbString) {
char[] utfBytes = gbString.toCharArray();
String unicodeBytes = "";
for (int i = 0; i < utfBytes.length; i++) {
String hexB = Integer.toHexString(utfBytes[i]);
if (hexB.length() <= 2) {
hexB = "00" + hexB;
}
unicodeBytes = unicodeBytes + "\\u" + hexB;
}
return unicodeBytes;
}
public static int getCharLen(char c, Graphics2D g) {
return g.getFontMetrics(g.getFont()).charWidth(c);
}
/**
* 给网络图片添加水印文字、可设置水印文字的旋转角度
*
* @param logoText
* @param srcImgPath
* @param targerPath
* @param degree
*/
public static void markNetImageByText(String logoText, String srcImgPath, String targerPath, Integer degree, String watermarkPosition) {
InputStream is = null;
OutputStream os = null;
try {
// 1、源图片
File file = getFile(srcImgPath);
Image srcImg = ImageIO.read(file);
int srcWidth = srcImg.getWidth(null);
int srcHeight = srcImg.getHeight(null);
double dmarkWidth = srcWidth * 0.2;// 设置水印的宽度为图片宽度的0.2倍
double dmarkHeight = dmarkWidth * ((double) srcHeight / (double) srcHeight);//强转为double计算宽高比例
int imarkWidth = (int) dmarkWidth;
int imarkHeight = (int) dmarkHeight;
int x;
int y;
switch (watermarkPosition) {
case "topLeft":
x = 100;
y = 100;
break;
case "topRight":
x = srcWidth - imarkWidth;
y = 100;
break;
case "bottomLeft":
x = 100;
y = srcHeight - imarkHeight / 4;
break;
case "bottomRight":
x = srcWidth - imarkWidth;
y = srcHeight - imarkHeight / 4;
break;
default:
x = srcWidth - imarkWidth;
y = srcHeight - imarkHeight / 4;
break;
}
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, x, y);
// 9、释放资源
g.dispose();
// 10、生成图片
os = new FileOutputStream(targerPath);
ImageIO.write(buffImg, "JPG", os);
} 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();
}
}
}
/**
* 将网络图片转file文件
*
* @param url
* @return
*/
public static File getFile(String url) {
//对本地文件命名
String fileName = url.substring(url.lastIndexOf("."));
File file = null;
URL urlfile;
InputStream inStream = null;
OutputStream os = null;
try {
file = File.createTempFile("net_url", fileName);
//下载
urlfile = new URL(url);
inStream = urlfile.openStream();
os = new FileOutputStream(file);
int bytesRead = 0;
byte[] buffer = new byte[8192];
while ((bytesRead = inStream.read(buffer, 0, 8192)) != -1) {
os.write(buffer, 0, bytesRead);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (null != os) {
os.close();
}
if (null != inStream) {
inStream.close();
}
if (null != file) {
file.deleteOnExit(); //程序退出时删除临时文件
}
} catch (Exception e) {
e.printStackTrace();
}
}
return file;
}
public static void main(String[] args) throws FileNotFoundException, IOException {
ImageRemarkUtil.markImageByText("ssss###aaa###ssss###aaa###sssssssssssssssssssssssssssssssssssssssssssssssss", "d:/11111.png", "d:/11112.png",0.02);
}
}
相关推荐
Java中使用Graphics2D实现图片添加文字/图片水印
java实现给图片添加水印实现步骤:获取原图片对象信息(本地图片或网络图片)添加水印(设置水印颜色、字体、坐标等)处理输出目标图片。
达夫设备 java_波特-达夫规则!
早在1984年,托马斯·波特(Thomas Porter)和汤姆·达夫(Tom Duff)撰写了一篇题为“合成数字图像”的论文,该论文描述了结合两个图像的12条规则。 在Java语言的1.2版中首次引入的AlphaComposite类中找到了对这些合成规则的支持。 当前处于beta 2中的1.4版支持所有12条规则。 对于诸如游戏之类的应用程序,包括多种图像类型(包括背景图像,玩家角色图像...
数字IC后端实现之快速获取innovus中drv violation的所有net list
数字IC后端设计实现之快速获取innovus中drv violation的所有net list
java实现pdf水印详解,支持换行、旋转且样式不会错乱,贼透彻
Java中使用itext对pdf'文件添加水印,代码清晰,样式简洁大方,非常适合新手阅读,同时对于有开发经验的伙伴也同样适用。
stackelberg博弈_博弈论、多智能体、强化学习(随便记点东西)
多智能体应用场景:已实现:游戏AI。正在努力:UAV,物资运输,快递分发,交通系统。未来:社会学,预测群体行为,城市区域合作,国际关系。博弈论基本定义:玩家集合: 策略集合: 收益函数: 囚徒困境:两智能体矩阵博弈坦白抵赖坦白1,13,0抵赖0,32,2占优策略与最佳应对:上表中两者均具有占优策略,即无论如何都应该选坦白。那么构造下表。坦白抵赖坦白1,13,0抵赖0,12,2对于玩家一来说,坦白...
关于使用CMT2300A FIFO缓存区间设置为64Byte的问题
帮助你解决在使用CMT2300A 时遇到的各种问题,若有需要,请及时与我交流
Java实现图片水印文字换行、平铺、旋转效果
Java代码实现对图片的水印文字的添加。 水印的效果是:水印文字的换行、水印文字的平铺、水印文字的旋转。 import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.Image; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileOutputStream; import javax.im
AUTOSAR E2E Protocol实战:Profile1到Profile5的配置差异与最佳实践
本文深入解析AUTOSAR E2E Protocol中Profile1到Profile5的核心配置差异与适用场景。针对经典CAN、CAN FD及以太网等不同总线,详细对比了计数器、CRC、DataID等关键参数,并结合实战代码与配置示例,为工程师根据功能安全等级、数据长度与带宽限制选择最佳Profile提供了清晰的选型路径与工程实践指南。
图片添加文字水印,自动换行,左右留白
参考的博客:https://blog.youkuaiyun.com/m0_37798992/article/details/80856338 原文实现了根据文字自动换行的逻辑。参考后略加修改和优化,实现了左右留白,文字在最下面显示。 package util; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; ...
SAP FICO实操:如何修改已发生业务数据的成本中心公司代码(附RKACOR06程序运行指南)
本文详细解析了SAP FICO系统中使用RKACOR06程序修改已发生业务数据的成本中心和公司代码的实操方法。通过实战案例分享,提供从前期准备到后期验证的全流程指南,帮助企业应对组织架构重组或财务核算体系调整时的数据迁移挑战,特别适用于跨公司代码的成本中心划转场景。
华为OD机试真题 新系统2026-04-01 Python&JS 实现【空间占用计算】
员工A的磁盘空间经常被耗尽,他需要找到占用空间最大的目录或文件,然后决定如何清理文件释放空间。给定某一目录,请编写程序帮助他统计该目录内一级子目录和文件的占用空间,并返回目标目录一级子项(文件或子目录)中占用空间最大的项。
Java图片添加文字/水印
@Test public void upload3 (){ String waterMarkContent="你好你是谁啊啊啊啊啊 你好你是谁啊啊啊啊啊啊啊啊啊啊啊啊 啊啊的方式发士 大夫是否地方是的防守打法是的你好你是谁啊啊啊啊啊 你好你是谁啊啊啊啊啊啊啊啊啊啊啊啊 啊啊的方式发士 大夫是否地方是的防守打法是的你好你是谁啊啊啊啊啊 你好你是谁啊啊啊啊啊啊啊啊啊啊啊啊 啊啊的方式发士 大夫是否...
u-boot-2014.10移植第22天----添加nand flash命令支持(四)
解决问题:nand0: MTD Erase failure: -5 drivers/mtd/nand/nand_bbt.c文件中初始化bbt/* * Allocate memory (2bit per block) and clear the memory bad block * table. */ this->bbt = kzalloc(len, GFP_
java基于原生awt实现 在图片上添加文字水印,支持多水印、自动换行和位置定义
简单的工具类,废话不多说,直接上代码
STM32(HAL库)驱动HC-SR04测距模块
本文介绍通过STM32F103C8T6单片机对HC-SR04测距模块进行驱动,并且通过串口对数据进行打印。
ET2012新版免狗免安装绿色软件
ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,
Java后台给PDF加水印并且合并多个PDF文件
目录前言准备环境代码添加依赖工具类测试测试加水印与背景测试pdf合并 前言 本文基于itext7实现pdf加水印和合并的操作。实际上在我们实际项目应用中,对于pdf的操作也是比较常见的,我上一个项目中就有将结果转成pdf导出的需求。本文是基于茶佬的笔记《JAVA 后端给 PDF 添加水印》写成。 准备环境 jdk8,idea2020.1.1,maven3 代码 添加依赖 <dependency> <groupId>cn.hutool</groupId> &
Statistics and Machine Learning Toolbox
Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具
Java文件处理:Image 图片裁剪、缩放和水印
Java文件处理:Image 图片裁剪、缩放和水印
Devexpress16.2.6破解工具
Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具
大中型超市收银系统(可直接运行)
光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开
java生成水印_(Java)图片添加水印,生成邀请函
用途说明:1.可以用于生成自定义的水印2.可以动态生成邀请函,指定特定对象的姓名、内容3.可以生成手写书信(这个下载对应的手写字体,安装到电脑就可用了)源码的功能:1.提供自定义字体属性(样式,大小,颜色)2.可以实现自动换行3.可以旋转文字4.可以保存多种格式,支持jpeg、jpg、png等样例展示:邀请函水印水平方向水印旋转源码分析:1.AddContent2Picture类的设计使用了构造者...
echart 固定刻度文字宽度_Java图片处理工具类:水印文字、缩放、切割、类型转换、颜色转换、图片属性...
功能简介使用 javax 和 java.awt 包下的 API 在 Java后台处理图片操作,主要提供如下的功能:添加水印文字(本文重点)图片缩放图片切割图片类型转换图片彩色转黑白获取图片属性背景 项目中做的喜报功能要往指定的群里推送喜报图片消息,使用固定模板图片,在图片模板上填充喜报相关的关键文字信息,在Java后台进行图片水印文字的绘制,本文主要介绍图片添加水印文字。效果图 水...
java文字水印换行_java把指定文字输出为图片流,支持文字换行
public classIamgeUtils {private static final int WIDTH = 350;private static final int HEIGHT = 100;private static Random random = newRandom();public static void main(String[] args) throwsIOException {...
Java实现PDF多行水印:换行、旋转、平铺全解析
在数字化文档流转中,水印是保护信息版权和标识密级的重要手段,其本质是对文本内容的排版控制。通过底层坐标变换与文本布局引擎,可以实现多行文字斜向铺满整个页面的效果,既保证视觉可辨识性,又不破坏原始文档结构。在Java生态中,利用开源的OpenPDF库的PdfContentByte与ColumnText组件,开发者能够在保留PDF矢量特性的前提下,灵活控制字体、透明度、旋转角度和网格间距,从而构建稳健的水印工具。此类技术适用于报告导出、合同管理、证书防伪等场景,帮助企业在不牺牲文档质量的前提下满足合规要求。方案
Java好用的合成图片工具
前言:互联网本质还是流量的生意,谁收割的流量最多,谁便是下一个赢家。“自古流量出社交”也就可以解释为什么每个APP都有一个社交梦,每个PM都有一颗想做社交的心。无论是B端产品还是C端产品,能够讲好一个“社交故事”,就很有可能给资本市场带来无穷的想象空间。公司一直有分享合成图片的场景,之前自己写起来比较费劲,最近找了一个比较好用的工具分享给大家码云地址,感谢opensourcechen的分享。 话不多说,直接上例子看效果 public void testCombineTopicImage() throws
Android调用相机拍照并添加水印
最近项目提出新需求,要求在拍照后在图片上添加用户信息的水印,so,楼主重新整理封装了一个简单的拍照+水印的工具类,需求不同,仅供参考。文件操作及权限做了适配,支持androidN及以上版本,放心使用。 效果演示: 如何调用相机这里就不介绍了,因为小伙伴们基本都使用过,主要介绍下实现水印的方式,实现水印效果也很简单,利用paint及canvas操作bitmap在对应位置进行绘制文
Excel转图片(Java方式)
Excel转换为图片工具,使用Java开发
java生成jpg_【JAVA】图片生成工具类
package com.XXX.utils.image;package com.hlf.vpos.common.utils.image;import javax.imageio.ImageIO;import javax.swing.*;import java.awt.*;import java.awt.image.BufferedImage;import java.io.*;import java...
1532



被折叠的 条评论
为什么被折叠?



