人在码上走,需求天天有。这不,今天前端让我返回一个带自定义水印的背景图片。一通google,有现成的代码,但是基本是直接在源图上添加水印,生成出来的文字样式也没有控制好,看来又只有自己造轮子了。

过程有点曲折,直接上最终代码:

import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.Transparency;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO; /**
* 图片处理工具类 基于https://blog.csdn.net/beinlife/article/details/53665152 改造
*/
public class ImageUtil { /**
* 生成背景透明的 文字水印,文字位于透明区域正中央,可设置旋转角度
*
* @param width 生成图片宽度
* @param heigth 生成图片高度
* @param text 水印文字
* @param color 颜色对象
* @param font awt字体
* @param degree 水印文字旋转角度
* @param alpha 水印不透明度0f-1.0f
*/
public static BufferedImage waterMarkByText(int width, int heigth, String text, Color color,
Font font, Double degree, float alpha) {
BufferedImage buffImg = new BufferedImage(width, heigth, BufferedImage.TYPE_INT_RGB);
/**2、得到画笔对象*/
Graphics2D g2d = buffImg.createGraphics();
// ---------- 增加下面的代码使得背景透明 -----------------
buffImg = g2d.getDeviceConfiguration()
.createCompatibleImage(width, heigth, Transparency.TRANSLUCENT);
g2d.dispose();
g2d = buffImg.createGraphics();
// ---------- 背景透明代码结束 ----------------- // 设置对线段的锯齿状边缘处理
g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
RenderingHints.VALUE_INTERPOLATION_BILINEAR); //把源图片写入
// g2d.drawImage(srcImg.getScaledInstance(srcImg.getWidth(null),
// srcImg.getHeight(null), Image.SCALE_SMOOTH), 0, 0,null); // 设置水印旋转
if (null != degree) {
//注意rotate函数参数theta,为弧度制,故需用Math.toRadians转换一下
//以矩形区域中央为圆心旋转
g2d.rotate(Math.toRadians(degree), (double) buffImg.getWidth() / 2,
(double) buffImg.getHeight() / 2);
} // 设置颜色
g2d.setColor(color); // 设置 Font
g2d.setFont(font); //设置透明度:1.0f为透明度 ,值从0-1.0,依次变得不透明
g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha));
//获取真实宽度
float realWidth = getRealFontWidth(text);
float fontSize = font.getSize();
//计算绘图偏移x、y,使得使得水印文字在图片中居中
//这里需要理解x、y坐标是基于Graphics2D.rotate过后的坐标系
float x = 0.5f * width - 0.5f * fontSize * realWidth;
float y = 0.5f * heigth + 0.5f * fontSize;
//取绘制的字串宽度、高度中间点进行偏移,使得文字在图片坐标中居中
g2d.drawString(text, x, y);
//释放资源
g2d.dispose();
// System.out.println("添加水印文字完成!");
return buffImg; }
public static BufferedImage waterMarkByText(int width, int heigth, String text, Color color, float alpha) {
//jdk默认字体
Font font = new Font("Dialog", Font.ROMAN_BASELINE, 33);
return waterMarkByText(width, heigth, text, color,font, -30d, alpha);
}
public static BufferedImage waterMarkByText(int width, int heigth, String text, float alpha) {
return waterMarkByText(width, heigth, text, Color.GRAY, alpha);
} public static BufferedImage waterMarkByText(int width, int heigth, String text) {
return waterMarkByText(width, heigth, text, 0.2f);
} public static BufferedImage waterMarkByText(String text) {
return waterMarkByText(200, 150, text);
} /**
* 获取真实字符串宽度,ascii字符占用0.5,中文字符占用1.0
*/
private static float getRealFontWidth(String text) {
int len = text.length();
float width = 0f;
for (int i = 0; i < len; i++) {
if (text.charAt(i) < 256) {
width += 0.5f;
} else {
width += 1.0f;
}
}
return width;
} public static void main(String[] args) {
int width = 200;
int heigth = 150;
Font font = new Font("微软雅黑", Font.ROMAN_BASELINE, 33);//字体
BufferedImage bi1 = waterMarkByText(width, heigth, "测试aB~,", Color.GRAY, font, -30d,
0.2f);//给图片添加文字水印
// BufferedImage bi = waterMarkByText(width, heigth, "测试aB~,", Color.GRAY, -30d,
// 0.2f);//给图片添加文字水印
// BufferedImage bi2 = waterMarkByText(width, heigth, "测试aB~,");//给图片添加文字水印
// BufferedImage bi3 = waterMarkByText("测试aB~,");
try {
ImageIO.write(bi1, "png", new File("D:/test.png"));//写入文件
System.out.println(Color.decode("#00bcd4"));
} catch (IOException e) {
e.printStackTrace();
}
}
}

最终效果如下:

完美解决~

java创建透明背景的PNG图片加自定义文字水印的更多相关文章

  1. javacpp-opencv图像处理之1:实时视频添加文字水印并截取视频图像保存成图片,实现文字水印的字体、位置、大小、粗度、翻转、平滑等操作

    欢迎大家积极开心的加入讨论群 群号:371249677 (点击这里进群) javaCV图像处理系列: javaCV图像处理之1:实时视频添加文字水印并截取视频图像保存成图片,实现文字水印的字体.位置. ...

  2. Java 如何给Word文档添加多行文字水印

    前言 我在以往的文章中曾介绍过如何给Word文档添加文本水印和图片水印,及怎样删除文档中的水印.关于文本水印,之前那篇教程里主要指的是单行字体的水印,而在操作Word文档时,有时也会碰到需要添加多行文 ...

  3. java 显示透明背景png图片

    首先理由ps生成一个背景透明的png图片,然后设置JPanel面板的透明属性,也就是panel.setOpaque(false);设置为透明 class MyPanel extends JLayere ...

  4. java 生成透明背景图片

    //开始绘图 graphics2d.setBackground(Color.WHITE); graphics2d.clearRect(0, 0, width, height); graphics2d. ...

  5. Java 创建一个简单的验证码图片

    代码如下: package lixin.gan.test; import java.awt.Color; import java.awt.Font; import java.awt.Graphics2 ...

  6. vc下打印透明背景图片

    一.前言 刚接到个任务,要把带有透明背景的章子图片打印出来,开始觉得不是很简单吗,直接用vc自动生成的打印功能不就ok了.不过问题却不是想像的那么简单! 二.窗口中显示透明图片 在窗口中显示图片,可以 ...

  7. 图片加水印文字,logo。生成缩略图

    简单JSP代码 图片加水银文字 try { String path = request.getRealPath("images\\01.jpg"); out.print(path) ...

  8. 用java实现给图片增加图片水印或者文字水印(也支持视频图像帧添加水印)

    javaCV图像处理系列: javaCV图像处理之1:实时视频添加文字水印并截取视频图像保存成图片,实现文字水印的字体.位置.大小.粗度.翻转.平滑等操作 javaCV图像处理之2:实时视频添加图片水 ...

  9. java解决poi导出excel文字水印,导出excel不可操作问题

    首先需求是用户提出导出excel数据需使用水印备注其用途: 其实就是在导出excel的同时带有自定义文字水印的导出. 那么我们首先想到的肯定是以一个什么样的思路去解决该问题,首先查找poi导出exce ...

随机推荐

  1. python100例 1-10

    001 数字重组 题目:有四个数字:1.2.3.4,能组成多少个互不相同且无重复数字的三位数?各是多少? for i in range(1,5): for j in range(1,5): for k ...

  2. PAT 1011 World Cup Betting (20分) 比较大小难度级别

    题目 With the 2010 FIFA World Cup running, football fans the world over were becoming increasingly exc ...

  3. Unity3D UGUI Image与父级保持比例缩放

    using UnityEngine; using System.Collections; using UnityEngine.UI; public class X_RectAutoSize : Mon ...

  4. 使用PHP得到所有的HTTP请求头

    作者:老王 在PHP里,想要得到所有的HTTP请求头,可以使用getallheaders方法,不过此方法并不是在任何环境下都存在,比如说,你使用fastcgi方式运行PHP的话,就没有这个方法,所以说 ...

  5. 王艳 201771010127《面向对象程序设计(java)》第七周学习总结

    1.实验目的与要求 (1)进一步理解4个成员访问权限修饰符的用途: (2)掌握Object类的常用API用法: (3)掌握ArrayList类用法与常用API: (4)掌握枚举类使用方法: (5)结合 ...

  6. poj3694 连通无向图图加边后有多少桥

    Network Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 10261   Accepted: 3807 Descript ...

  7. 【MySQL】如何解决分库分表遇到的自增主键的问题?

    雪花算法 Redis生成主键

  8. vue 配置移动单位转换插件 postcss-px-to-viewport

    1.先安装插件 npm install postcss-px-to-viewport --save-dev 2.在文件根目录下添加 postcss.config.js 文件 module.export ...

  9. 手把手教你Windows Linux双系统的安装与卸载

    作者:-叶丶知秋 链接:https://blog.csdn.net/fanxueya1322/article/details/90205143 转载请保留出处 良许前言: 后台突然有很多小伙伴留言想看 ...

  10. 深入理解JS:执行上下文中的this(一)

    目录 执行上下文与执行上下文栈 this 全局环境 函数环境 总结 参考 1.执行上下文与执行上下文栈 (1)什么是执行上下文? 在 JavaScript 代码运行时,解释执行全局代码.调用函数或使用 ...