Perkenalkan antara muka penjanaan kod QR zxing yang matang untuk menjana fail kod QR standard, dan tambah penerangan teks yang berkaitan pada kod QR melalui grafik java dan API pemprosesan imej seperti yang diperlukan, anda boleh mensintesis Tambahkan latar belakang yang berkaitan pada imej akhir. Contoh ditunjukkan di bawah:
1 Mari kita ambil bitmap dahulu Kod teras untuk menghasilkan imej kod QR adalah seperti berikut
/** * 定义二维码的参数 */ HashMap<EncodeHintType, Object> hints = new HashMap(); //指定字符编码为“utf-8” hints.put(EncodeHintType.CHARACTER_SET, "utf-8"); //指定二维码的纠错等级为中级 hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H); //设置图片的边距 hints.put(EncodeHintType.MARGIN, 1); /** * 生成二维码 */ try { BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, QRCODE_WIDTH, QRCODE_HEIGHT, hints); Path file = new File(filePath).toPath(); MatrixToImageWriter.writeToPath(bitMatrix, format, file); } catch (Exception e) { log.error("二维码生成出错:/permitDownload: error", e); }
2. Tambahkan teks pada kod QR
/** * 给二维码下方添加说明文字 * * @param image 原二维码 * @param topText 顶部说明文字 * @param downText 底部说明文字 * @return 带说明文字的二维码 */ private static BufferedImage addNote(BufferedImage image, String topText, String downText) { Image src = image.getScaledInstance(QRCODE_WIDTH, QRCODE_HEIGHT, Image.SCALE_DEFAULT); BufferedImage tag = new BufferedImage(QRCODE_WIDTH, IMAGE_HEIGHT, BufferedImage.TYPE_INT_RGB); Graphics2D g2 = tag.createGraphics();//设置文字 g2.setColor(Color.BLACK); g2.setBackground(Color.WHITE); g2.clearRect(0,0,QRCODE_WIDTH, IMAGE_HEIGHT); //设置顶部文本并计算坐标 // 保证操作系统包含“宋体”字体,如果没有上传字体至JAVA_HOME/jre/lib/fonts下 FontMetrics fm = getFontByWidth(new Font("宋体", Font.PLAIN, DEFAULT_FONT_SIZE), topText, g2); //文字的宽度 int fontWidth = fm.stringWidth(topText); //文字高度 int fontHeight = fm.getHeight(); /** * 顶部添加文字并居中 */ g2.drawString(topText, (QRCODE_WIDTH - fontWidth) / 2, (TEXT_DEFAULT_HEIGHT - fontHeight) / 2 + fm.getFont().getSize()); /** * 绘制二维码 */ g2.drawImage(src, 0, TEXT_DEFAULT_HEIGHT, null); // 设置底部文字字体并计算坐标 // 保证操作系统包含“宋体”字体,如果没有上传字体至JAVA_HOME/jre/lib/fonts下 fm = getFontByWidth(new Font("宋体", Font.PLAIN, DEFAULT_FONT_SIZE), downText, g2); //文字的宽度 fontWidth = fm.stringWidth(downText); //文字高度 fontHeight = fm.getHeight(); /** * 添加底部文字 */ g2.drawString(downText, (QRCODE_WIDTH - fontWidth) / 2, QRCODE_HEIGHT + TEXT_DEFAULT_HEIGHT+(TEXT_DEFAULT_HEIGHT - fontHeight) / 2 + fm.getFont().getSize()); g2.dispose(); image = tag; image.flush(); return image; }
Titik pengetahuan: Panjang teks bawah akan berubah, reka bentuk semasa Hanya satu baris teks diletakkan, jadi saiz teks akan diubah secara dinamik mengikut bilangan perkataan dalam julat yang munasabah (tidak terlalu kecil untuk dikenali Menggunakan objek FontMetrics, titik ini akan menjadi). membantu kebanyakan pelajar
3 Ubah suai fon dan saiz secara dinamik
/** * 根据文字长度改变文字大小 * * @param font 默认字体 * @param note 文字内容 * @param g2 图像画布 * @return 处理后的字体封装 */ private static FontMetrics getFontByWidth(Font font, String note, Graphics2D g2) { FontMetrics fm = g2.getFontMetrics(font); int textWidth = fm.stringWidth(note);//文字的宽度 if (textWidth > QRCODE_WIDTH) { int fontSize = (int) ((TEMP_PARAM / textWidth) * font.getSize()); font = new Font(font.getName(), font.getStyle(), fontSize); } g2.setFont(font); return g2.getFontMetrics(font); }
4 adalah untuk menggabungkan imej asas biru dan imej kod QR, dan itu sahaja.
Langkah 1: Buat kanvas Anda perlu menetapkan lebar dan tinggi kanvas 🎜>
Langkah 2: Buat objek grafik Graphics2D pada kanvas Anda boleh menetapkan maklumat seperti latar belakang, latar depan, sempadan, lebar dan maklumat lain berdasarkan pemahaman anda tentang titik pengetahuan imejBufferedImage tag = new BufferedImage(QRCODE_WIDTH, IMAGE_HEIGHT, BufferedImage.TYPE_INT_RGB);
<🎜. >Langkah 3: Mensintesis imej, dalam proses Susunan penambahan gambar, saiz gambar dan kedudukan koordinat akan menjejaskan kesan pembentangan akhir Jika kesan akhir tidak memenuhi keperluan reka bentuk, pelarasan ketiga-tiga parameter ini pasti akan membantu
Graphics2D g2 = tag.createGraphics();//设置文字
Langkah 4: Hasilkan gambar baharu
Image src = image.getScaledInstance(QRCODE_WIDTH, QRCODE_HEIGHT, Image.SCALE_DEFAULT); ... /** * 绘制二维码 */ g2.drawImage(src, 0, TEXT_DEFAULT_HEIGHT, null);
Gambar kedua dijana dalam proses yang sama seperti gambar pertama, kecuali susunan dalam [2 kod QR] ditukar dari atas, tengah dan bawah ke kiri , kanan kepada
/** * 给二维码图片添加背景图片 * * @param qrPic 二维码 * @param backImage 背景图片 */ private static void createNewPng(File qrPic, BufferedImage backImage) { try { if (!qrPic.isFile()) { log.error("二维码临时路径不存在!"); } /** * 读取背景图片,并构建绘图对象--画布 */ Graphics2D g = backImage.createGraphics(); /** * 读取二维码图片 */ BufferedImage qrcodeImage = ImageIO.read(qrPic); //开始绘制图片 g.drawImage(qrcodeImage, 48, 120, qrcodeImage.getWidth(), qrcodeImage.getHeight(), null); g.dispose(); ImageIO.write(backImage, "png", qrPic); } catch (Exception e) { log.error("绘制二维码出错!"); } }
Atas ialah kandungan terperinci Bagaimana untuk mensintesis imej kod QR kompleks dengan java zxing. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!