开源)Java生成二维码分享海报(3)

简介: 开源)Java生成二维码分享海报

第四步,将自动换行后的文本在海报背景上打印。


这里需要用到 FontDesignMetrics 的 getHeight() 方法获取每行文本的高度。对照下面的示意图,理解 height 的具体高度。


image.png


// 自动换行后的文本
String zhWrap = FontUtil.makeLineFeed(graphics2dPoster.getZh(), metrics, graphics2dPoster.getSuitableWidth());
// 拆分行
String[] zhWraps = zhWrap.split("\n");
// 将每一行在海报背景上打印
for (int i = 0; i < zhWraps.length; i++) {
  graphics2dPoster.addCurrentY(metrics.getHeight());
  graphics2d.drawString(zhWraps[i], MARGIN, graphics2dPoster.getCurrentY());
}



此时的海报效果如下图所示。

image.png



可以看得出,文字带有很强的锯齿感,怎么消除呢?


graphics2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);


如果英语不好的话,看起来这段代码会很吃力。ANTIALIASING 单词的意思就是“消除混叠现象,消除走样,图形保真”。


07、利用 Graphics2D 在海报上打印英文


英文和中文最大的不同在于,换行的单位不再是单个字符,而是整个单词。


第一步,根据当前字体下每个英文单词的宽度,以及海报可容纳的最大文本宽度,对文本进行换行。


public static String makeEnLineFeed(String en, FontDesignMetrics metrics, int max_width) {
  // 每个单词后追加空格
  char space = ' ';
  int spaceWidth = metrics.charWidth(space);
  // 按照空格对英文文本进行拆分
  String[] words = en.split(String.valueOf(space));
  // 利用 StringBuilder 对字符串进行修改
  StringBuilder sb = new StringBuilder();
  // 每行文本的宽度
  int len = 0;
  for (int i = 0; i < words.length; i++) {
  String word = words[i];
  int wordWidth = metrics.stringWidth(word);
  // 叠加当前单词的宽度
  len += wordWidth;
  // 超出最大宽度,进行换行
  if (len > max_width) {
    sb.append("\n");
    sb.append(word);
    sb.append(space);
    // 下一行的起始宽度
    len = wordWidth + spaceWidth;
  } else {
    sb.append(word);
    sb.append(space);
    // 多了一个空格
    len += spaceWidth;
  }
  }
  return sb.toString();
}

假如文本是“Fear can hold you prisoner. Hope can set you free. It takes a strong man to save himself, and a great man to save another.”我们来通过 makeEnLineFeed() 方法试验一下。


Font font = new Font("微软雅黑", Font.PLAIN, 28);

FontDesignMetrics metrics = FontDesignMetrics.getMetrics(font);


String en = "Fear can hold you prisoner. Hope can set you free. It takes a strong man to save himself, and a great man to save another.";

String[] rows = makeEnLineFeed(en, metrics, 600).split("\n");

for (int i = 0; i < rows.length; i++) {

System.out.println(rows[i]);

}


其结果如下所示。


Fear can hold you prisoner. Hope can set

you free. It takes a strong man to save

himself, and a great man to save another.

第三步,将自动换行后的文本在海报背景上打印。


// 设置封面图和下方中文之间的距离
graphics2dPoster.addCurrentY(20);
Graphics2D graphics2d = graphics2dPoster.getGraphics2d();
graphics2d.setColor(new Color(157, 157, 157));
FontDesignMetrics metrics = FontDesignMetrics.getMetrics(graphics2d.getFont());
String enWrap = FontUtil.makeEnLineFeed(graphics2dPoster.getEn(), metrics, graphics2dPoster.getSuitableWidth());
String[] enWraps = enWrap.split("\n");
for (int i = 0; i < enWraps.length; i++) {
  graphics2dPoster.addCurrentY(metrics.getHeight());
  graphics2d.drawString(enWraps[i], MARGIN, graphics2dPoster.getCurrentY());
}

此时的海报效果如下图所示。

image.png




相关文章
|
8月前
|
消息中间件 人工智能 Java
抖音微信爆款小游戏大全:免费休闲/竞技/益智/PHP+Java全筏开源开发
本文基于2025年最新行业数据,深入解析抖音/微信爆款小游戏的开发逻辑,重点讲解PHP+Java双引擎架构实战,涵盖技术选型、架构设计、性能优化与开源生态,提供完整开源工具链,助力开发者从理论到落地打造高留存、高并发的小游戏产品。
|
8月前
|
人工智能 Java 开发者
阿里出手!Java 开发者狂喜!开源 AI Agent 框架 JManus 来了,初次见面就心动~
JManus是阿里开源的Java版OpenManus,基于Spring AI Alibaba框架,助力Java开发者便捷应用AI技术。支持多Agent框架、网页配置、MCP协议及PLAN-ACT模式,可集成多模型,适配阿里云百炼平台与本地ollama。提供Docker与源码部署方式,具备无限上下文处理能力,适用于复杂AI场景。当前仍在完善模型配置等功能,欢迎参与开源共建。
3079 58
阿里出手!Java 开发者狂喜!开源 AI Agent 框架 JManus 来了,初次见面就心动~
|
9月前
|
Java Linux Apache
Apache NetBeans 27 (macOS, Linux, Windows) - Java 等多语言开源跨平台 IDE
Apache NetBeans 27 (macOS, Linux, Windows) - Java 等多语言开源跨平台 IDE
559 5
Apache NetBeans 27 (macOS, Linux, Windows) - Java 等多语言开源跨平台 IDE
|
10月前
|
Java 数据安全/隐私保护
快手小红书抖音留痕工具,自动留痕插件工具,java代码开源
这个框架包含三个核心模块:主操作类处理点赞评论、配置管理类和代理管理类。使用时需要配合
|
11月前
|
文字识别 监控 Java
顺丰同城抢单辅助脚本,顺丰骑士抢单辅助免封号,自动抢单神器【java版开源】
这是一套OCR实时检测订单列表并自动右滑的完整代码方案,适用于学习研究。代码包含四个主要模块:OCR处理(文字识别)、价格分析
|
11月前
|
NoSQL Java Redis
推荐一款好用的开源免费Java CMS内容管理站群系统
Java开源内容管理系统(JProcms),基于SpringCloud、SpringBoot、MyBatisPlus、Vue3等技术构建,采用Apache-2.0协议,支持免费商用。系统具备自定义字段存储与可视化设计、API制作网站群页面等功能,强调简单灵活的设计理念,降低二次开发成本。支持多种数据库、消息队列和认证方式,提供SaaS多租户、动态权限菜单、工作流配置等强大功能,同时集成阿里云、腾讯云服务,适用于高效建站与内容管理。
1874 4
|
12月前
|
人工智能 Kubernetes Java
回归开源,两位 Java 和 Go 程序员分享的开源贡献指引
Higress是一个基于Istio和Envoy的云原生API网关,支持AI功能扩展。它通过Go/Rust/JS编写的Wasm插件提供可扩展架构,并包含Node和Java的console模块。Higress起源于阿里巴巴,解决了Tengine配置重载及gRPC/Dubbo负载均衡问题,现已成为阿里云API网关的基础。本文介绍Higress的基本架构、功能(如AI网关、API管理、Ingress流量网关等)、部署方式以及如何参与开源贡献。此外,还提供了有效的开源贡献指南和社区交流信息。
2152 33
|
人工智能 Java 决策智能
Java版Manus实现来了,Spring AI Alibaba发布开源OpenManus实现
此次官方发布的 Spring AI Alibaba OpenManus 实现,包含完整的多智能体任务规划、思考与执行流程,可以让开发者体验 Java 版本的多智能体效果。它能够根据用户的问题进行分析,操作浏览器,执行代码等来完成复杂任务等。
2404 57
|
数据可视化 JavaScript Java
2K star!三分钟搭建企业级后台系统,这款开源Java框架绝了!
"LikeAdmin Java是基于Spring Boot + Mybatis Plus + Vue 3的快速开发平台,内置RBAC权限管理、工作流引擎、数据可视化、三方登录等核心模块,助力开发者快速构建企业级中后台管理系统"
1453 19