前两天在为“批量生成二维码压缩并下载功能”做技术选型时,遇到了在不同服务器文字居中效果不一致问题,一直觉得是在不同系统对绘制文字的开始位置有问题引起,今天找到了解决方法,记录一下!
具体的功能需求如下:
1. 生成的二维码内包含一个居中的logo
2. 二维码上面有一个居中的10位数字编号
3. 10位数字编号要求有序
4. 批量生成这样的二维码图片
5. 对二维码图片打包压缩为zip进行下载
考虑到该功能是系统管理员使用,使用频次不大,10的数字编号使用数据库序列实现,二维码使用Google的zxing,zip压缩包使用Java原生ZipOutputStream,zxing和ZipOutputStream的使用网上有很多就不写了,这里主要记录一下文字居中的方法。
/**
* 向图片添加居中文字
*
* @param g 图片的Graphics对象
* @param text 要添加的居中文字
* @param rect 文字要相对居中的矩形
* @param font 文字字体
*/
public void drawCenteredString(Graphics g, String text, Rectangle rect, Font font) {
// 获取图片的FontMetrics
FontMetrics metrics = g.getFontMetrics(font);
// 计算开始绘制文字的x轴位置
int x = rect.x + (rect.width - metrics.stringWidth(text)) / 2;
// 计算开始绘制文字的y轴位置
int y = rect.y + ((rect.height - metrics.getHeight()) / 2) + metrics.getAscent();
// 设置字体
g.setFont(font);
// 设置文字颜色
g.setColor(Color.black);
// 绘制文字
g.drawString(text, x, y);
}