在软件开发中,有时会遇到一类看似不是很复杂但实际却很具挑战性的情景:绘图。无论业务复杂度和技术难度如何,绘图总是易引起挑剔之声,感受深刻、伤害致命。最近遇到这样一个场景,需要使用Java的Graphics2D类来绘制业务所需的图形模板,并在其基础上填充数据,然后将其储存起来。尽管逻辑并不复杂,但由于牵涉到ToC和ToB两端的交互,需要极为慎重对待。
绘制具体图形之前,需要先处理好本地字体安装,使用设计师提供的字体。字体安装后,我们可以通过Java读取验证,然后直接使用。
以下是一个Java示例,用于检索并打印本地已安装的字体:
public class Typeface {
public static void main(String[] args) {
List<String> fontNames = new java.util.ArrayList<>();
Font[] fonts = GraphicsEnvironment.getLocalGraphicsEnvironment().getAllFonts();
for (Font font : fonts){
fontNames.add(font.getName());
}
fontNames.forEach(System.out::println);
}
}
绘图涉及一些简单的图形样式,如线条、矩形、圆弧线等,这些都可以使用
Graphics2D
类直接生成。以下是一个简单的程序,它创建了一张500×500的图片,在图片中绘制了一些基本的图形样式,最后保存到本地。
public class DrawDraft {
public static void main(String[] args) throws Exception {
// 1、创建图片绘图
BufferedImage image = new BufferedImage(500, 500, BufferedImage.TYPE_4BYTE_ABGR);
Graphics2D graphics = image.createGraphics();
graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
graphics.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
// 2、填充背景色
graphics.setColor(Color.white);
graphics.fillRect(0, 0, 500, 500);
// …(省略其余绘制代码)
// 5、写到图片
ImageIO.write(image, "png", new File("src/main/draw-draft.png"));
image.flush();
graphics.dispose();
}
}
通常在业务场景中,我们会先绘制模板图形,然后在其基础上填充数据,避免数据填充时出现排版问题。如果有大量的动态数据内容,可以使用模板引擎。以下示例展示了如何在模板图形上进行文本添加,其中包括动态对齐和排版等问题,并最终添加签章实现制图生效。
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;
public class DrawImage {
//…(省略其余代码)
}
在文末,报告源代码的仓库链接:
文档仓库:
https://gitee.com/cicadasmile/butte-java-note
源码仓库:
https://gitee.com/cicadasmile/butte-spring-parent
未经允许不得转载:大白鲨游戏网 » 使用Java的Graphics2D类进行图形绘制