jdk11中获取Font类字体宽度

一、场景需求

将一段文字通过Graphics类写到图片中时,需要知道这段文字的长度和宽度,用以确定最终生成的图片的长度和宽度。

二、jdk8实现方案

对于字体

Font font = new Font(FONT_NAME, FONT_STYLE, FONT_SIZE);

1、使用sun.font.FontDesignMetrics类中的方法

获取宽度,包括字符串的、字符的、字符数组的。

FontDesignMetrics metrics = FontDesignMetrics.getMetrics(font);
String text = "text for test";
int textWidth = metrics.stringWidth(text, 0, text.length());

int charWidth = metrics.charWidth('a');

int charsWidth = metrics.charsWidth(text.toCharArray(), 0, text.length());

获取高度

metrics.getHeight();

2、java.awt.Toolkit#getFontMetrics方法,拿到 Metrics后,方法同上。但是这个方法已经弃用了:

replaced by the Font method getLineMetrics 

被Font类中的java.awt.Font#getLineMetrics方法替代,该方法有多个重载。而最终得到的LineMetrics对象信息中也无法获取我们想要的宽度,高度可以拿到。

三、一个问号

在jdk11中,sun.font.FontDesignMetrics这个类,它有点奇怪:

提示信息为:Package 'sun.font' is declared in module 'java.desktop', which does not export it to the unnamed module

意思是sun.font这个包是在java.desktop模块中声明的,但它并未被导出到当前这个未命名的模块

解决方案提示为:Add '--add-exports java.desktop/sun.font=ALL-UNNAMED' to module compiler options

意思是需要在编译参数中加上这个参数(点一下自己就加上了): --add-exports java.desktop/sun.font=ALL-UNNAMED

加上它以后确实是可以了:

然后在java编译参数中可以看到多了这么一项:

四、两个问号

这东西,是jdk9实装了模块系统概念以后,这个包属于别的模块(java.desktop),才导致的吗?在idea开发环境是可以用了,在非开发的jdk11环境中,能编译通过吗?打jar包以后能正常运行吗?还是说打包时要加什么参数?或者运行时加什么参数?在以后的jdk中会被弃用吗?

以后有时间再试试。

五、替代方案

最终找寻一个替代方案:

FontRenderContext frc = new FontRenderContext(new AffineTransform(), true, true);
Rectangle rec = STRING_FONT.getStringBounds("a", frc).getBounds();
double height = rec.getHeight();
double width = rec.getWidth();

 满足了需求,做一个记录。


 

使用Linux平台上的Java编程语言实现给图片加上文字水印,将文文字展示为方框形状的步骤如下: 1. 首先,确保系统环境已经安装了Java开发工具(JDK)和相关的库文件。 2. 在Java代码引入相关的图像处理库,例如Java提供的AWT和Java 2D库。 3. 加载待添加水印的图片文件。可以使用Java IO库的相关,如ImageIO,来读取和处理图片文件。 4. 创建一个新的图片对象,以便在其上添加水印。可以使用BufferedImage来创建一个空白的图片对象,并设置其大小和颜色模式。 5. 根据读取的图片文件,将其内容绘制到新的图片对象。可以使用Java 2D库的Graphics和Graphics2D来实现这一步骤。 6. 设计一个方框形状的文水印。可以通过Java字体相关(如FontFontMetrics等)来设置合适的字体样式和字号,并计算文字的宽度和高度。 7. 在新的图片对象的指定坐标位置上绘制方框形状的文水印。可以使用Java 2D库的绘图方法,如drawRect()函数绘制方框的边框,fillRect()函数填充方框的内部,以及drawString()函数绘制文文字。 8. 最后,将新生成的带有水印的图片保存到文件。可以使用ImageIO的write()函数将图片对象保存为指定的格式(如JPEG、PNG等)的文件。 通过以上步骤,就可以在Linux平台上使用Java编程实现给图片加上文方框水印的功能了。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值