Java实现画图 给图片底部添加文字标题
作者:趙小傑 发布时间:2023-03-28 23:23:06
标签:Java,图片,文字,标题
Java画图 给图片底部添加文字标题
需求给图片底部添加文字编号
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.font.FontRenderContext;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
/**
* JAVA 画图(生成文字水印)
*
* @author 杰宝宝
*
*/
public class ImageUtil {
/**
* @param str
* 生产的图片文字
* @param oldPath
* 原图片保存路径
* @param newPath
* 新图片保存路径
* @param width
* 定义生成图片宽度
* @param height
* 定义生成图片高度
* @return
* @throws IOException
*/
public void create(String str, String oldPath, String newPath, int width, int height){
try {
File oldFile = new File(oldPath);
Image image = ImageIO.read(oldFile);
File file = new File(newPath);
BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics2D g2 = bi.createGraphics();
g2.setBackground(Color.WHITE);
g2.clearRect(0, 0, width, height);
g2.drawImage(image, 0, 0, width - 25, height - 25, null); //这里减去25是为了防止字和图重合
/** 设置生成图片的文字样式 * */
Font font = new Font("黑体", Font.BOLD, 25);
g2.setFont(font);
g2.setPaint(Color.BLACK);
/** 设置字体在图片中的位置 在这里是居中* */
FontRenderContext context = g2.getFontRenderContext();
Rectangle2D bounds = font.getStringBounds(str, context);
double x = (width - bounds.getWidth()) / 2;
//double y = (height - bounds.getHeight()) / 2; //Y轴居中
double y = (height - bounds.getHeight());
double ascent = -bounds.getY();
double baseY = y + ascent;
/** 防止生成的文字带有锯齿 * */
g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
/** 在图片上生成文字 * */
g2.drawString(str, (int) x, (int) baseY);
ImageIO.write(bi, "jpg", file);
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
try {
ImageUtil img = new ImageUtil();
img.create("编号:0011", "E:\\111.png", "E:\\222.png", 455, 455);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
原图:
生成后:
Java 给图片添加文字水印
水印操作有很多,例如:给图片添加文字、图片水印,给pdf文件添加水印,给文件加盖公章,这类需求还是时常会遇到的,今天就简单记录一下给图片添加文字水印的demo,仅供大家参考,后续会写别的情况的添加水印的demo,有用到的可以关注一下。
package com.gupaoedu.vip.test;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
public class watermark {
/**
* 给图片添加水印
*/
public void addWaterMark() {
Color color = new Color(255, 200, 0, 118); // 水印颜色
Font font = new Font("微软雅黑", Font.ITALIC, 45); //水印字体
String waterMarkContent="我爱你 I LOVE YOU"; //水印内容
String tarImgPath = "C:\\Users\\yun\\Desktop\\新建文件夹\\timg2.jpg"; //存储目标路径
try {
File file = new File("C:\\Users\\yun\\Desktop\\新建文件夹\\timg.jpg"); //原图片
BufferedImage buImage = ImageIO.read(file);
int width = buImage.getWidth(); //图片宽
int height = buImage.getHeight(); //图片高
//添加水印
BufferedImage bufferedImage = new BufferedImage(width,height,BufferedImage.TYPE_INT_BGR);
Graphics2D g = bufferedImage.createGraphics();
g.drawImage(buImage, 0, 0, width, height, null);
g.setColor(color); //水印颜色
g.setFont(font); //水印字体
int x = width -2*getWatermarkLength(waterMarkContent, g); //这是一个计算水印位置的函数,可以根据需求添加
int y = height - 1*getWatermarkLength(waterMarkContent, g);
g.drawString(waterMarkContent, 400, 300); //水印位置
g.dispose(); //释放资源
FileOutputStream outImgStream = new FileOutputStream(tarImgPath);
ImageIO.write(bufferedImage, "jpg", outImgStream);
System.out.println("添加水印完成");
outImgStream.flush();
outImgStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public int getWatermarkLength(String waterMarkContent, Graphics2D g) {
return g.getFontMetrics(g.getFont()).charsWidth(waterMarkContent.toCharArray(), 0, waterMarkContent.length());
}
public static void main(String[] args) {
new watermark().addWaterMark();
}
}
来源:https://blog.csdn.net/qq_22906343/article/details/82117831


猜你喜欢
- 因项目集成了Redis缓存部分数据,需要在程序启动时将数据加载到Redis中,即初始化数据到Redis。在SpringBoot项目下,即在容
- 本文实例为大家分享了Winform实现石头剪刀布游戏的具体代码,供大家参考,具体内容如下新建一个windows窗体程序,用数字1代表石头,用
- 前言当大家使用mybatis作为持久层框架时,在存储和查询数据时,只需要在mapper.xml文件中配置好对应字段的JdbcType和Jav
- 系列文章已完成,目录如下:jdk-logging log4j logback日志系统实现机制原理介绍commons-lo
- 工厂方法模式(Factory Method):定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。工
- 本文实例讲述了Android开发之开关按钮控件ToggleButton简单用法。分享给大家供大家参考,具体如下:先来看看运行效果:具体代码如
- 1、VS打开 工具-》NuGet包管理器-》管理解决方案的NuGet程序包如果打开界面一直搜索,加载不出东西,查看https://www.n
- 一、注解注解(Annotation): 从jdk5.0开始引进,可以对程序进行解释或被其他程序读取。注解格式:"@注释名"
- @Autowired使用构造函数注入public Class Outer { private Inner inner; @Autowired
- String类基本概念String类属于引用数据类型,不属于基本数据类型。在Java中只要是" "(双引号)中的,都是S
- C和指针相关基础知识:内存的分配(谭浩强版)1、整型变量的地址与浮点型/字符型变量的地址区别?(整型变量/浮点型变量的区别是什么)2、int
- 前言项目中有需求在APP的Webview中长按图片可以保存。后来就去研究一下该怎么实现,顺便整理了一下。WebView基本配置mWvCont
- 一、问题描述如果在 SpringBoot 项目中的 application.properties 配置了某个属性(假如属性名为 test.k
- 我们知道:int i = 5;long j = 7;i = i + j不能编译,但i += j却能编译运行,结果i = 12。这是因为:i
- 本文实例讲述了Java Web项目部署在Tomcat运行出错与解决方法。分享给大家供大家参考,具体如下:1、在部署Java Web项目的过程
- 数据结构是数据存储的方式,算法是数据计算的方式。所以在开发中,算法和数据结构息息相关。今天的讲义中会涉及部分数据结构的专业名词,如果各位铁粉
- 详解java中接口与抽象类的区别1.abstract class 在 Java 语言中表示的是一种继承关系,一个类只能使用一次继承关系。但是
- 下面给大家分享一小段代码给大家介绍C# 输出字符串到文本文件中,具体代码如下所示: public class WriteHelp
- 1. 问题描述:自己修改了下 ${M2_HOME}/conf/settings.xml中的本地repository地址,但是重新执行mvn的
- 最近再开发中遇到需要将文件上传到Linux服务器上,至此整理代码笔记。此种连接方法中有考虑到并发问题,在进行创建FTP连接的时候