使用Java的Graphics2D类进行图形绘制

在软件开发中,有时会遇到一类看似不是很复杂但实际却很具挑战性的情景:绘图。无论业务复杂度和技术难度如何,绘图总是易引起挑剔之声,感受深刻、伤害致命。最近遇到这样一个场景,需要使用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类进行图形绘制