Rumah > Java > javaTutorial > Bagaimana untuk mensintesis imej kod QR kompleks dengan java zxing

Bagaimana untuk mensintesis imej kod QR kompleks dengan java zxing

WBOY
Lepaskan: 2023-04-18 15:16:03
ke hadapan
1441 orang telah melayarinya

Idea keseluruhan:

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:

Bagaimana untuk mensintesis imej kod QR kompleks dengan java zxing

  • 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);
        }
Salin selepas log masuk
  • 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;
    }
Salin selepas log masuk

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);
    }
Salin selepas log masuk
  • 4 adalah untuk menggabungkan imej asas biru dan imej kod QR, dan itu sahaja.

Sintesis Gambar Empat Langkah

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 imej
BufferedImage tag = new BufferedImage(QRCODE_WIDTH, IMAGE_HEIGHT, BufferedImage.TYPE_INT_RGB);
Salin selepas log masuk

<🎜. >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();//设置文字
Salin selepas log masuk

Langkah 4: Hasilkan gambar baharu

Image src = image.getScaledInstance(QRCODE_WIDTH, QRCODE_HEIGHT, Image.SCALE_DEFAULT);
...
 /**
* 绘制二维码
 */
g2.drawImage(src, 0, TEXT_DEFAULT_HEIGHT, null);
Salin selepas log masuk

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("绘制二维码出错!");
        }
    }
Salin selepas log masuk
Perangkap yang telah dipijak

Piksel dan saiz imej latar belakang perlu memadankan kod QR, jika tidak nisbah antara kod QR dan latar belakang akan menjadi tidak seimbang atau Paparan kod QR tidak lengkap
  • Kod QR menambah teks bercelaru dalam pembangunan persekitaran (windows) dan persekitaran ujian (versi pelayan centos). Tiada masalah dalam pembangunan dan ujian tempatan Selepas pembungkusan dan penggunaan ke pelayan, semua aksara Cina kelihatan bercelaru (pelbagai transkod, tetapan fon, penyahpepijatan untuk masa yang lama), tetapi masalahnya masih tidak berubah. Akhirnya, saya tiba-tiba mendapat idea dan mengesyaki bahawa ia adalah masalah fon sistem saya menyemak maklumat fon persekitaran ujian (centos) dan memang tidak ada "Songti" saya menetapkannya kepada fon sistem sendiri atau lalai masalah masih berterusan. Akhir sekali, salin fon daripada sistem pembangunan (c:windowsfontssimsun.ttc) ke sistem ujian (JAVA_HOME/jre/libs/fonts) dan mulakan semula aplikasi, dan masalah itu diselesaikan dengan sempurna. Agak menyusahkan untuk menyediakan fon untuk pemasangan dan penggunaan sistem Saya tidak tahu jika ada cara yang lebih baik untuk memasukkan fon logik dan fon fizikal.
  • Projek masalah pemuatan imej latar belakang ialah projek springboot. Imej latar belakang disimpan dalam folder sumber Tiada pengecualian ditemui dalam pembangunan dan ujian tempatan sedang dibungkus dan digunakan ke pelayan Kod asal adalah seperti berikut
  • Saya telah mencuba semua cara untuk memuatkan imej di Internet, tetapi ia tidak memberi kesan menukarnya kepada aliran input dan sintesis imej adalah seperti biasa

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!

Label berkaitan:
sumber:yisu.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan