java制作海报一:java使用Graphics2D 在图片上写字,文字换行算法详解
2021/4/9 20:29:23
本文主要是介绍java制作海报一:java使用Graphics2D 在图片上写字,文字换行算法详解,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
文章目录
- 前言
- 一、直接上代码
- 1. 写字方法
- 2. 换行算法
- 二、 叙述换行算法
前言
- 代码都上传到GitHub了,这里仅仅是贴出来主要部分,GitHub传送门:https://github.com/fengfanli/draw_poster_echarts
- 海报制作的所有博客和一些问题:
文字换行算法详解
,传送门:头像切割成圆形方法详解
,传送门:获取微信二维码详情
,传送门:java BufferedImage 转 InputStream
,传送门:png 图片合成到模板(另一个图片)上时,透明部分变成了黑色
,传送门:java 整合echarts 画出 折线图
,传送门:Graphics2D的RenderingHints方法参数详解,包括解决文字不清晰,抗锯齿问题
,传送门:项目部署到linux下中文不显示,echarts图上的中文也不显示问题
,传送门:
- 本次博客主要是 稍微说一下文字换行算法,这里的代码都在
PosterUtil.java
中
一、直接上代码
1. 写字方法
/** * @return java.awt.Graphics2D * @Author fengfanli * @Description //TODO 在背景模板上写字,注意 需要换行算法 * @Date 9:58 2021/3/30 * @Param [bufferedImage, words, wordsFont, fontSize, wordsX, wordsY, wordsWidth, wordsHeight] **/ public static void drawWords(BufferedImage bufferedImage, String words, Boolean isAddFontSpace, String wordsFont, int fontSize, int wordsX, int wordsY, int wordsWidth, int wordsHeight) { Graphics2D g2d = bufferedImage.createGraphics(); // 抗锯齿 添加文字 g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB); // VALUE_TEXT_ANTIALIAS_ON 改为 VALUE_TEXT_ANTIALIAS_LCD_HRGB g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2d.getDeviceConfiguration().createCompatibleImage(wordsWidth, wordsHeight, Transparency.TRANSLUCENT); Font font = new Font(wordsFont, Font.BOLD, fontSize); g2d.setFont(font); Color color = new Color(51, 51, 51); g2d.setColor(color); // 换行算法 drawWordAndLineFeed(g2d, font, words, wordsX, wordsY, wordsWidth); g2d.dispose(); }
2. 换行算法
/** * @return void * @Author fengfanli * @Description //TODO 写字换行算法 * @Date 18:08 2021/4/1 * @Param [] **/ private static void drawWordAndLineFeed(Graphics2D g2d, Font font, String words, int wordsX, int wordsY, int wordsWidth) { FontDesignMetrics metrics = FontDesignMetrics.getMetrics(font); // 获取字符的最高的高度 int height = metrics.getHeight(); int width = 0; int count = 0; int total = words.length(); String subWords = words; int b = 0; for (int i = 0; i < total; i++) { // 统计字符串宽度 并与 预设好的宽度 作比较 if (width <= wordsWidth) { width += metrics.charWidth(words.charAt(i)); // 获取每个字符的宽度 count++; } else { // 画 除了最后一行的前几行 String substring = subWords.substring(0, count); g2d.drawString(substring, wordsX, wordsY + (b * height)); subWords = subWords.substring(count); b++; width = 0; count = 0; } // 画 最后一行字符串 if (i == total - 1) { g2d.drawString(subWords, wordsX, wordsY + (b * height)); } } }
二、 叙述换行算法
通过 下面这行语句 算出 字的最大高度,和每个字符的宽度
FontDesignMetrics metrics = FontDesignMetrics.getMetrics(font); // 获取字符的最高的高度 int height = metrics.getHeight(); width = metrics.charWidth(words.charAt(0)); // 获取第一个字符的宽度
约定好 写字的 width 宽度和height 高度
然后计算每个字符的宽度相加,当大于width时,就写下来,然后换行
高度就要相加 height。
最后一行有点特殊,仔细看代码就能明白啦,需要单独拿出来进行写。
这篇关于java制作海报一:java使用Graphics2D 在图片上写字,文字换行算法详解的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-06-26结对编程到底难不难?答案在这里
- 2024-06-19《2023版Java工程师》课程升级公告
- 2024-06-15matplotlib作图不显示3D图,怎么办?
- 2024-06-1503-Loki 日志监控
- 2024-06-1504-让LLM理解知识 -Prompt
- 2024-06-05做软件测试需要懂代码吗?
- 2024-06-0514-ShardingSphere的分布式主键实现
- 2024-06-03为什么以及如何要进行架构设计权衡?
- 2024-05-31全网首发第二弹!软考2024年5月《软件设计师》真题+解析+答案!(11-20题)
- 2024-05-31全网首发!软考2024年5月《软件设计师》真题+解析+答案!(21-30题)