import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.font.FontRenderContext;
import java.awt.font.TextLayout;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;

public class DeviceNameplate {
    private static final String DEVICE_NAME = '1#配电房';
    private static final String[] TEXT_LINES = {'编号:123', '型号:1000 * 2342', '类别:机械类', '位置:合金产线'};
    private static final String COMPANY_NAME = 'xxx有限公司';
    private static final Color BORDER_COLOR = new Color(30, 66, 153);
    private static final int IMAGE_WIDTH = 400;
    private static final int IMAGE_HEIGHT = 200;
    private static final int BORDER_PADDING = 10;
    private static final int BORDER_WIDTH = 5;
    private static final int CORNER_RADIUS = 10;
    private static final int QR_CODE_SIZE = 100;
    private static final int QR_CODE_PADDING = 20;
    private static final Font DEVICE_NAME_FONT = new Font('Arial', Font.BOLD, 30);
    private static final Font TEXT_FONT = new Font('Arial', Font.PLAIN, 15);
    private static final Font COMPANY_NAME_FONT = new Font('Arial', Font.BOLD, 20);

    public static void main(String[] args) throws IOException {
        BufferedImage image = new BufferedImage(IMAGE_WIDTH, IMAGE_HEIGHT, BufferedImage.TYPE_INT_RGB);
        Graphics2D g2d = image.createGraphics();
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g2d.setColor(Color.WHITE);
        g2d.fillRect(0, 0, IMAGE_WIDTH, IMAGE_HEIGHT);

        // Draw device name
        g2d.setColor(Color.WHITE);
        g2d.setFont(DEVICE_NAME_FONT);
        FontRenderContext frc = g2d.getFontRenderContext();
        TextLayout layout = new TextLayout(DEVICE_NAME, DEVICE_NAME_FONT, frc);
        Rectangle2D bounds = layout.getBounds();
        int x = (int) ((IMAGE_WIDTH - bounds.getWidth()) / 2);
        int y = BORDER_PADDING + (int) bounds.getHeight();
        layout.draw(g2d, x, y);

        // Draw border
        g2d.setColor(BORDER_COLOR);
        g2d.setStroke(new BasicStroke(BORDER_WIDTH));
        RoundRectangle2D border = new RoundRectangle2D.Double(BORDER_PADDING, y + BORDER_PADDING, IMAGE_WIDTH - BORDER_PADDING * 2, QR_CODE_SIZE + QR_CODE_PADDING * 2 + TEXT_LINES.length * TEXT_FONT.getSize() + BORDER_PADDING * 2, CORNER_RADIUS, CORNER_RADIUS);
        g2d.draw(border);

        // Draw QR code
        BufferedImage qrCode = generateQRCode('https://www.example.com', QR_CODE_SIZE, QR_CODE_SIZE);
        int qrCodeX = (int) border.getCenterX() - QR_CODE_SIZE / 2;
        int qrCodeY = (int) border.getY() + QR_CODE_PADDING;
        g2d.drawImage(qrCode, qrCodeX, qrCodeY, null);

        // Draw text
        g2d.setColor(Color.BLACK);
        g2d.setFont(TEXT_FONT);
        int textX = (int) border.getX() + QR_CODE_SIZE + QR_CODE_PADDING * 2;
        int textY = qrCodeY + QR_CODE_SIZE / 2 - TEXT_LINES.length * TEXT_FONT.getSize() / 2;
        for (String line : TEXT_LINES) {
            layout = new TextLayout(line, TEXT_FONT, frc);
            layout.draw(g2d, textX, textY);
            textY += layout.getBounds().getHeight();
        }

        // Draw company name
        g2d.setColor(Color.WHITE);
        g2d.setFont(COMPANY_NAME_FONT);
        layout = new TextLayout(COMPANY_NAME, COMPANY_NAME_FONT, frc);
        bounds = layout.getBounds();
        x = (int) ((IMAGE_WIDTH - bounds.getWidth()) / 2);
        y = IMAGE_HEIGHT - BORDER_PADDING - (int) bounds.getHeight();
        layout.draw(g2d, x, y);

        g2d.dispose();
        ImageIO.write(image, 'png', new File('device_nameplate.png'));
    }

    private static BufferedImage generateQRCode(String text, int width, int height) {
        // Implementation of QR code generation using a third-party library
        return null;
    }
}
Java BufferedImage 设备铭牌生成:带二维码、文字和边框

原文地址: https://www.cveoy.top/t/topic/nj65 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录