Java图片编辑合成:Graphics2D

721 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第18天,点击查看活动详情

写在前面

最近有一个需求,搞的人们有些头大;后来发现不是大家不会搞,完全就是不想搞,图片操作这种类似的需求基本上就是前端来处理。

现在丢给后端,自然是不太乐意。

但是没有办法,谁叫咱命苦呢。

这是一个什么样的需求?

话说,在开小程序端接口时,因为涉及到一些具体的元素信息页面。

所以通过微信来生成出一些特定二维码,专门来指向小程序中某个具体的元素信息详情页面。

但是微信API生成的二维码并没有任何标识信息。

于是这个需求就出现了,产品必须要每一个二维码下方带有元素名称的信息标识。

解决方案

如果解决这个问题,其实一开始是没什么思路的。

毕竟Java来处理图片的时代早已经过去了,近几年的Java语言早已经不流行处理这些了。

百度、google一番后,得到一个结果。

那就是Graphics2D,通过这个类可以增加一块类似幕布的底片,然后将原二维码图片放置到底片上。

随后在底片上的某个区域,我这里选择的是最下方来放置文字信息。

并且在这过程中设置了文字的左右居中。

可以参考一下代码,如果有人碰到这种情况了,可以自己根据要求修改。

    public static void main(String[] args) throws IOException {
        InputStream inputStream = new FileInputStream("D:/2.png");
        BufferedImage bufferedImage = ImageIO.read(inputStream);
        BufferedImage image = new BufferedImage(310, 335, BufferedImage.TYPE_INT_RGB);
        Graphics2D graphics2D = image.createGraphics();
        graphics2D.fillRect(0, 0, 310, 335);
        graphics2D.drawImage(bufferedImage.getScaledInstance(280, 280, Image.SCALE_AREA_AVERAGING), 15, 15, 280, 280, null);
        Font font = new Font("黑体", Font.BOLD, 20);
        graphics2D.setFont(font);
        graphics2D.setColor(Color.BLACK);
        String text = "XJSDHG";
        FontMetrics metrics = graphics2D.getFontMetrics(font);
        int startX = (310 - metrics.stringWidth(text)) / 2;
        graphics2D.drawString(text, startX, 320);
        ImageInputStream imageInputStream = ImageIO.createImageInputStream(image);
        ImageIO.write(image,"png",new FileOutputStream("D:/3.png"));
    }

还是要大概解读一下关键的几行代码。

graphics2D.fillRect(0, 0, 310, 335);

填充底片为白色,参数分别是起始横纵坐标、填充像素大小。

FontMetrics metrics = graphics2D.getFontMetrics(font);
int startX = (310 - metrics.stringWidth(text)) / 2;
graphics2D.drawString(text, startX, 320);

居中处理,通过获取文字占用的像素大小来和原有像素做对比,得到起始坐标。

graphics2D.drawImage(bufferedImage.getScaledInstance(280, 280, Image.SCALE_AREA_AVERAGING), 15, 15, 280, 280, null);

填充图片,参数分别是图片对象、起始横纵坐标,覆盖像素长宽等。

总结

已经可以基本符合需求,当然这个也可以做一个比较好看的海报,将二维码放到指定的位置。