Java | 将文字生成在空白图片居中位置(根据图片大小,自动调节文字大小)


话不多说,直接上代码。(大家可以自己根据需要设置图片大小,不过图片过小时,字体会变模糊,尽量设置图片大一点,600~1000左右比较合适)

代码:
import lombok.extern.slf4j.Slf4j;
import sun.font.FontDesignMetrics;import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;/*** 慌途L* 描述:将文字居中对齐生成在空白图片中间*/
@Slf4j
public class ImagesUtils {/*** 图片宽度*/private static final int WIDTH = 800;/*** 图片高度*/private static final int HEIGHT = 800;/*** 字符间距缩放比*/private static final double SCALE_WORD_SPACE = 1.0;/*** 文字开头和结尾在图片中距离左、右的总和(单边距离最少30)*/private static final int MIN_DISTANCE = 60;/*** 文字大小*/public static int size = 120;/*** 默认字体格式*/private static final Font font = new Font("宋体", Font.PLAIN, size);/*** 生成图片并转成字节流,方便上传到OSS服务器** @param content 文字* @return 返回字节流*/public static InputStream generateImagesToInputStream(String content) {BufferedImage image = drawString(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB, content, Color.BLACK, SCALE_WORD_SPACE);ByteArrayOutputStream os = new ByteArrayOutputStream();InputStream input = null;try {ImageIO.write(image, "jpg", os);input = new ByteArrayInputStream(os.toByteArray());return input;} catch (IOException e) {e.printStackTrace();log.error("根据文字生成图片转换成字节流异常", e);throw new RuntimeException("根据文字生成图片转换成字节流异常...");}}/*** 根据文字生成图片** @param content   文字* @param filePath  生成图片后存的路径和名字(如:D:\\test.jpg)* @return 返回图片路径*/public static String generateImages(String content, String filePath) {OutputStream out = null;try {BufferedImage bufferedImage = drawString(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB, content, Color.BLACK, SCALE_WORD_SPACE);out = new BufferedOutputStream(new FileOutputStream(filePath));ImageIO.write(bufferedImage, "jpg", out);return filePath;} catch (Exception e) {e.printStackTrace();log.error("根据文字生成图片转换成字节流异常", e);throw new RuntimeException("根据文字生成图片转换成字节流异常...");} finally {try {out.close();} catch (IOException e) {e.printStackTrace();log.error("关流失败");}}}/*** 绘制图片** @param width          画布宽* @param height         画布高* @param imageType      画布类型* @param content        绘制的文本* @param color          字体颜色* @param scaleWordSpace 字符间距缩放比* @return*/public static BufferedImage drawString(int width, int height, int imageType, String content, Color color, double scaleWordSpace) {BufferedImage image = new BufferedImage(width, height, imageType);Graphics2D graphics = image.createGraphics();// 填充白色背景图graphics.fillRect(0, 0, width, height);graphics.setColor(Color.WHITE);// 设置字体Font font = new Font("宋体", Font.PLAIN, size);graphics.setFont(font);//根据字体格式,获取字符串占用宽度int stringWidth = graphics.getFontMetrics().stringWidth(content);//通过比较字符串体每次设定完尺寸后的宽度是否超过图片宽度限定尺寸,从而减小字体尺寸while (stringWidth > (width + MIN_DISTANCE)) {size -= 1;graphics.setFont(new Font("宋体", Font.PLAIN, size));stringWidth = graphics.getFontMetrics().stringWidth(content);}// 计算文字在图片中的x轴坐标int x = (width - stringWidth) / 2;while (x < (MIN_DISTANCE / 2)) {size -= 1;graphics.setFont(new Font("宋体", Font.PLAIN, size));stringWidth = graphics.getFontMetrics().stringWidth(content);x = (width - stringWidth) / 2;}// 平分文字前和文字后距离图片边距X轴的距离x = x / 2;// 设置字体颜色graphics.setColor(color);// 抗锯齿 添加文字 (KEY_TEXT_ANTIALIASING 确定对文本着色时是否抗锯齿。可能的值有 VALUE_TEXT_ANTIALIASING_ON, _OFF 或 _DEFAULT)graphics.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);// 用于计算字体的宽高FontDesignMetrics metrics = FontDesignMetrics.getMetrics(font);// 计算文字在宽高的位置进行固定Rectangle2D bounds = metrics.getStringBounds(content, graphics);int boundsHeight = (int) bounds.getHeight();// 文字在图片中的y轴坐标int y = Math.round((height + boundsHeight - font.getSize() * 1.0f / 2) / 2 - 2);// 将文字在图片中指定的xy轴坐标画出drawString(content, x, y, scaleWordSpace, graphics);graphics.dispose();image.flush();return image;}/*** 根据X-Y轴的坐标绘制字体在图片中的位置** @param content        绘制的文本* @param x              起始位置* @param y              起始位置* @param scaleWordSpace 字符间距缩放比* @param graphics*/private static void drawString(String content, int x, int y, double scaleWordSpace, Graphics graphics) {String tempStr = "";int tempx = x;int tempy = y;double workSpace = scaleWordSpace;double orgStringWith = 0.0;while (content.length() > 0) {tempStr = content.substring(0, 1);content = content.substring(1);orgStringWith = graphics.getFontMetrics().stringWidth(tempStr);graphics.drawString(tempStr, tempx, tempy);// 如果不是中文则需要增加字符或数字之间的间距workSpace = !isContainChinese(tempStr) ? 1.3 : workSpace;if (tempStr.getBytes().length == 1) {tempx = (int) Math.round(tempx + orgStringWith * workSpace * 0.8);} else {tempx = (int) Math.round(tempx + orgStringWith * workSpace);}}}/*** 判断字符串中是否包含中文** @param str 待校验字符串* @return 是:true 否:false* @warn 不能校验是否为中文标点符号*/private static boolean isContainChinese(String str) {Pattern p = Pattern.compile("[\u4e00-\u9fa5]");Matcher m = p.matcher(str);return m.find();}public static void main(String[] args) {String filePath = ImagesUtils.generateImages("12345652316411sdfffdf", "F:\\test.jpg");System.out.println(filePath);}
}

Java | 将文字生成在空白图片居中位置(根据图片大小,自动调节文字大小)相关推荐

  1. java使用zxing生成二维码,可带logo和底部文字

    java使用zxing生成二维码,可带logo和底部文字 springboot中整合zxing生成二维码 一.导入依赖 <properties><zxing.version>3 ...

  2. Python通过文字生成语音,随机获取视频或图片素材生成伪原创的短视频

    前段时间写了一篇<抖音自动引流脚本源码>主要通过语录系统自动生成语句或随机评论,适用于自动评论引流脚本. 今天脑洞大开,想用Python通过文字生成语音,随机获取视频或图片素材生成伪原创的 ...

  3. 前端开发css中怎么让图片居中?css图片居中的方法总结

    在进行网页布局的时候,有时候图片的位置可能会影响整个页面的美观程度,所以对于图片的放置位置就得变化,那么,接下来的这篇文章将给大家来介绍关于图片在网页中如何使用css实现居中的方法,对于有需要的朋友来 ...

  4. css中怎么让图片居中?css图片居中的方法总结

    在进行网页布局的时候,有时候图片的位置可能会影响整个页面的美观程度,所以对于图片的放置位置就得变化,那么,接下来的这篇文章将给大家来介绍关于图片在网页中如何使用css实现居中的方法,对于有需要的朋友来 ...

  5. markdown 图片居中_Markdown更改字体、颜色、大小,插入表格等方法

    Markdown 通过简单标记语法,使普通文本内容具有一定格式.但它本身不支持修改字体.字号与颜色等功能的.一.更改字体大小.颜色.更改字体Markdown语法 效果如下: 二.更改字体大小.颜色.更 ...

  6. ios 图片居中裁剪_IOS图片裁剪和小图看大图动画

    IOS的UIImagePickerController可以让用户通过相机或者相册获取想要的图片,并且通过设置allowsEditing属性允许用户在选择了图片以后对图片进行裁剪.不过在某些时候会出现正 ...

  7. CSDN写博客修改图片大小、图片居中、去掉图片水印等方法

    CSDN写文章技巧 修改为指定尺寸 图片居中显示 图片底部插入题注 段落前面空格 图片居中自定义大小 两张或者多张图片并排在一起 不同颜色字体 一.修改图片为指定大小 计划将该图片缩放为指定尺寸,需要 ...

  8. 手机端扣扣浏览器图片居中_实现图片始终居中显示于浏览器窗口中心位置

    盒模型 在敲代码之前,首先建立一个盒模型,这让写代码的时候变得思路清晰. 本案例中,所要实现的是图片居中显示,超出浏览器窗口部分的图片隐藏.因此,盒模型如图: 图片以浏览器窗口作为定位元素,居中显示. ...

  9. AndroidStudio_android中实现图片动态设置图片的位置以及图片动态缩放---Android原生开发工作笔记234

    可以通过下面的代码进行设置 <ImageViewandroid:id="@+id/face_img"android:layout_width="wrap_conte ...

最新文章

  1. MySQL8.0.16主从同步
  2. ios开发之使用多文件上传的简单封装最原始的
  3. 【ArcGIS遇上Python】ArcGIS10.6 python批量将栅格中的特定值替换Setnull为NoData
  4. oauth2.0授权码_OAUTH 2.0授权码授予
  5. HDFS文件和HIVE表的一些操作
  6. 被小程序冲击的人,请正视小程序!
  7. 一文看尽Google I/O大会:AI打电话以假乱真,TPU 3.0正式发布
  8. 一文弄懂nginx反向代理和负载均衡
  9. nodejs 图片处理模块 rotate_会照片处理的不只是ps,还有python!
  10. 局域网远程访问时显示密码过期
  11. appuim+python自动化测试计算器实例
  12. java 获取vm配置参数_如何获取Java中的Java VM规范?
  13. 1、spring源码解析之概况流程
  14. uniapp—配置自定义基座
  15. 【Markdown小技巧】 整理小图标和表情符号
  16. 企业微信 手机 接收的文件 存放路径
  17. 必应Bing图片中心的图片版权问题
  18. 看不见的大猩猩--读书笔记
  19. Yolov3没框原因和解决办法
  20. 最新彩色文字方格广告位代码

热门文章

  1. Mac上win7虚拟机显示图标字体太小
  2. elasticsearch 安装包百度云盘下载
  3. 打印图片一直显示连接传真服务器,连接w7共享的
  4. 计算机维护基础知识ppt,日常维护和计算机基础知识.ppt
  5. Linux运维三剑客
  6. CleanMyMac X2021中文官方永久免费全新系统清理管家软件
  7. oracle cf enqueue,ORA-00494,enqueue [CF]故障诊断
  8. Win11打不开Windows安全中心
  9. 碧桂园博智林机器人总部大楼_碧桂园佛肇区域工程管理部参观博智林机器人创研中心总部大楼项目...
  10. Azure ML 机器学习: 创建 Workspace 以及获得 Workspace 的多种方法