最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java?zxing合成復雜二維碼圖片示例詳解

 更新時間:2022年05月19日 11:05:58   作者:八月他大  
這篇文章主要為大家介紹了java?zxing合成復雜二維碼圖片示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

說明:

最近接到需要將二維碼合成復雜圖片的需求,要求給二維碼上下或者左側添加相關文字描述,技術沒有難點,整理本文主要記錄思路和踩過的坑。

整體思路:

引入zxing成熟的二維碼生成接口,生成標準二維碼文件,通過java圖形圖像處理API為二維碼添加相關文字描述,根據(jù)需要,可以為合成后的圖片添加相關背景。示例如下圖所示:

  • 1.先拿點位圖來說,生成二維碼圖片核心代碼如下
        /**
         * 定義二維碼的參數(shù)
         */
        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.給二維碼添加文字
    /**
     * 給二維碼下方添加說明文字
     *
     * @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);
        //設置頂部文本并計算坐標
        // 保證操作系統(tǒng)包含“宋體”字體,如果沒有上傳字體至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);
        // 設置底部文字字體并計算坐標
        // 保證操作系統(tǒng)包含“宋體”字體,如果沒有上傳字體至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;
    }

知識點 : 底部文字長度會變,目前設計只放一行文字,所以根據(jù)字數(shù)多少會動態(tài)改變文字大小在一個合理區(qū)間(不至于太小無法識別),使用FontMetrics 對象,這個點會對多數(shù)同學有幫助

  • 3.動態(tài)修改字體及大小
    /**
     * 根據(jù)文字長度改變文字大小
     *
     * @param font 默認字體
     * @param note 文字內(nèi)容
     * @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.最后一步將藍色底圖與二維碼圖片合成,就可以了。

圖片合成四部曲

第一步:創(chuàng)建畫布,需要設置畫布的寬、高,單位應該是像素

BufferedImage tag = new BufferedImage(QRCODE_WIDTH, IMAGE_HEIGHT, BufferedImage.TYPE_INT_RGB);

第二步: 在畫布上創(chuàng)建圖形對象Graphics2D,可以根據(jù)你對圖像知識點的了解設置如背景、前景、邊框、寬度等信息

Graphics2D g2 = tag.createGraphics();//設置文字

第三步: 合成圖片,過程中的圖片添加順序、圖片大小、坐標位置會影響最終的呈現(xiàn)效果,如果最終效果沒有達到設計需求,調(diào)整這三個參數(shù)一定會有所幫助

Image src = image.getScaledInstance(QRCODE_WIDTH, QRCODE_HEIGHT, Image.SCALE_DEFAULT);
...
 /**
* 繪制二維碼
 */
g2.drawImage(src, 0, TEXT_DEFAULT_HEIGHT, null);

第四步: 生成最終的新圖片

    /**
     * 給二維碼圖片添加背景圖片
     *
     * @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("繪制二維碼出錯!");
        }
    }

第二張圖片和第一張圖片生成過程相同,只是將文中 【2. 給二維碼添加文字】中的順序由上、中、下變?yōu)?左、右即可

踩過的坑

  • 背景圖片像素、大小需要和二維碼匹配,否則會出現(xiàn)二維碼與背景比例嚴重失調(diào)或二維碼顯示不完整
  • 二維碼添加文字亂碼 開發(fā)環(huán)境(windows),測試環(huán)境(centos 服務器版)。本地開發(fā)測試沒有任何問題,打包部署至服務器后所有中文字符出現(xiàn)亂碼(各種轉碼,字體設置,調(diào)試整了很久),問題仍然沒有任何變化。最終靈光一現(xiàn)懷疑是系統(tǒng)字體問題,查了測試環(huán)境(centos)字體信息確實沒有“宋體”,設置成系統(tǒng)自有或默認的字體,問題還在。最終從(c:\windows\fonts\simsun.ttc)開發(fā)系統(tǒng)中copy字體至測試系統(tǒng)(JAVA_HOME/jre/libs/fonts)中后重啟應用,問題得到完美解決。系統(tǒng)安裝部署需要準備字體有點麻煩,不知道還有沒有更好的辦法,字體有邏輯字體和物理字體,愛、先這樣吧。
  • 背景圖片加載問題 項目為springboot項目,背景圖片存放在resources文件夾下,本地開發(fā)測試未見異常,打包部署至服務器后背景圖片無法找到,原始代碼如下
        String backFilePath = "template/down.png";
        ClassPathResource resource = new ClassPathResource(backFilePath);
        File file = resource.getFile();

在網(wǎng)上找加載圖片的方法都使用過,沒有效果,最后修改為輸入流,圖片合成正常,代碼如下

        /**
         * 必須通過流方式,否則不同操作系統(tǒng)無法拿到背景圖片信息
         */
        String backFilePath = "template/down.png";
        ClassPathResource resource = new ClassPathResource(backFilePath);
        BufferedImage bi = ImageIO.read(resource.getInputStream());

以上就是java zxing合成復雜二維碼圖片示例詳解的詳細內(nèi)容,更多關于java zxing合成復雜二維碼的資料請關注腳本之家其它相關文章!

相關文章

  • Java Eclipse進行斷點調(diào)試的方法

    Java Eclipse進行斷點調(diào)試的方法

    本篇文章主要介紹了Java Eclipse進行斷點調(diào)試的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-11-11
  • java獲取當前時間的四種方法代碼實例

    java獲取當前時間的四種方法代碼實例

    這篇文章主要介紹了java獲取當前時間的四種方法代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-09-09
  • 徹底理解Spring注解@Autowired實現(xiàn)原理

    徹底理解Spring注解@Autowired實現(xiàn)原理

    這篇文章主要為大家詳細的介紹了Spring注解@Autowired實現(xiàn)的原理,縝密的邏輯分析,實踐應用示例操作說明,讓大家徹底的理解Spring注解@Autowired背后實現(xiàn)原理
    2022-03-03
  • Kotlin this詳解及實例

    Kotlin this詳解及實例

    這篇文章主要介紹了Kotlin this詳解及實例的相關資料,需要的朋友可以參考下
    2017-06-06
  • SpringBoot多租戶配置與實現(xiàn)示例

    SpringBoot多租戶配置與實現(xiàn)示例

    本文詳細介紹了在SpringBoot中實現(xiàn)多租戶架構的方法和步驟,包括配置數(shù)據(jù)源、Hibernate攔截器、租戶解析器等,以共享數(shù)據(jù)庫、共享數(shù)據(jù)表的方式,確保數(shù)據(jù)隔離和安全性,感興趣的可以了解一下
    2024-09-09
  • Java畢業(yè)設計實戰(zhàn)之平行志愿管理系統(tǒng)的實現(xiàn)

    Java畢業(yè)設計實戰(zhàn)之平行志愿管理系統(tǒng)的實現(xiàn)

    這是一個使用了java+Springboot+Maven+mybatis+Vue+Mysql開發(fā)的圖片平行志愿管理系統(tǒng),是一個畢業(yè)設計的實戰(zhàn)練習,具有志愿管理該有的所有功能,感興趣的朋友快來看看吧
    2022-02-02
  • Java設計模式以虹貓藍兔的故事講解代理模式

    Java設計模式以虹貓藍兔的故事講解代理模式

    代理模式是Java常見的設計模式之一。所謂代理模式是指客戶端并不直接調(diào)用實際的對象,而是通過調(diào)用代理,來間接的調(diào)用實際的對象
    2022-04-04
  • 用Java實現(xiàn)一個靜態(tài)鏈表的方法步驟

    用Java實現(xiàn)一個靜態(tài)鏈表的方法步驟

    這篇文章主要介紹了用Java實現(xiàn)一個靜態(tài)鏈表的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-02-02
  • Java判斷object對象為空(包括null ,““)的方法

    Java判斷object對象為空(包括null ,““)的方法

    這篇文章主要介紹了Java判斷對象是否為空(包括null ,“”)的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-12-12
  • JavaWeb開發(fā)之【Tomcat 環(huán)境配置】MyEclipse+IDEA配置教程

    JavaWeb開發(fā)之【Tomcat 環(huán)境配置】MyEclipse+IDEA配置教程

    這篇文章主要介紹了JavaWeb開發(fā)之【Tomcat 環(huán)境配置】MyEclipse+IDEA配置教程,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-10-10

最新評論

琼海市| 女性| 西峡县| 梅河口市| 汕尾市| 英吉沙县| 凤城市| 江山市| 桃源县| 永川市| 安乡县| 益阳市| 东海县| 敦化市| 汾阳市| 会宁县| 堆龙德庆县| 宁夏| 方山县| 大同县| 革吉县| 区。| 济南市| 颍上县| 南投县| 临沭县| 永和县| 蓬安县| 绍兴县| 湟源县| 容城县| 田东县| 海伦市| 监利县| 山丹县| 正镶白旗| 阳江市| 玛沁县| 新沂市| 遂宁市| 阿坝|