Java BufferedImage 设备铭牌生成:带二维码、文字和边框
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;
}
}
原文地址: https://www.cveoy.top/t/topic/nj65 著作权归作者所有。请勿转载和采集!