Java使用Graphics2D生成一个证书

482 阅读1分钟

一、上代码

talk is cheap show you the code

public class WaterMarkTest {
    /**
     * 设置水印
     * @param graphics2D 绘图对象
     * @param context 要绘制的内容
     * @param x 位置:横坐标
     * @param y 位置:纵坐标
     * @param font 字体
     * @param color 字体颜色(RGB Color对象)
     */
    public static void setMark(Graphics2D graphics2D, String context, Integer x, Integer y, Font font, Color color) {
        // 设置字体
        graphics2D.setFont(font);
        // 设置颜色
        graphics2D.setColor(color);
        // 写字
        graphics2D.drawString(context, x, y);
    }

    public static void main(String[] args) throws IOException {
        // 读取原图片信息
        ClassPathResource resource = new ClassPathResource("test.png");
        InputStream inputStream = resource.getInputStream();
        //文件转化为图片
        Image srcImg = ImageIO.read(inputStream);
        //获取图片的宽、高
        int srcImgWidth = srcImg.getWidth(null);
        int srcImgHeight = srcImg.getHeight(null);
        // 加水印
        BufferedImage bufImg = new BufferedImage(srcImgWidth, srcImgHeight, BufferedImage.TYPE_INT_RGB);
        Graphics2D g = bufImg.createGraphics();
        g.drawImage(srcImg, 0, 0, srcImgWidth, srcImgHeight, null);
        // 证书中写字
        setMark(g, "张三丰 666啊", 335, 400, new Font("Songti SC", Font.PLAIN, 64), Color.decode("#332e2e"));
        setMark(g, "666 高级认证", 380, 480, new Font("Songti SC", Font.PLAIN, 46), Color.decode("#e71f19"));
        //画出水印
        g.dispose();

        // 下载证书
        ByteArrayOutputStream bs = new ByteArrayOutputStream();
        ImageOutputStream imOut = ImageIO.createImageOutputStream(bs);
        ImageIO.write(bufImg, "png", imOut);
        InputStream inputStream2 = new ByteArrayInputStream(bs.toByteArray());

        OutputStream outStream = new FileOutputStream("result.png");
        IOUtils.copy(inputStream2, outStream);
        inputStream.close();
        outStream.close();
    }
}

二、注意事项

2.1、如何确定自己的字体有哪些?

public static void main(String[] args) {
	GraphicsEnvironment e = GraphicsEnvironment.getLocalGraphicsEnvironment();
	String[] fontName = e.getAvailableFontFamilyNames();
        for (int i = 0; i < fontName.length; i++) {
            System.out.println(fontName[i]);
        }
}

2.2、如何确定x、y轴位置?

类似于下面, "张三丰 666啊"这个左下角位置(335px, 400px),那么x、y位置就是335、400

image.png

三、原图材料附件

wecomtempcefd5f3d2bc056989afb94cc130a3441.png