Java生產帶文字、帶邊框的二維碼

Java 生成帶文字、帶邊框的二維碼

  • 1、Java 生成帶文字的二維碼
    • 1.1、導入jar包
    • 1.2、普通單一的二維碼
      • 1.2.1、代碼示例
      • 1.2.2、效果
    • 1.3、帶文字的二維碼
      • 1.3.1、代碼示例
      • 1.3.2、效果
  • 2、帶邊框的二維碼
    • 2.1、代碼示例
    • 2.2、帶邊框的二維碼效果

1、Java 生成帶文字的二維碼

在做一些標簽時,我們時常會用到二維碼,現在我們利用Java來生成二維碼。

1.1、導入jar包

在pom.xml中,導入zxing包

	<dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.4.1</version></dependency><dependency><groupId>com.google.zxing</groupId><artifactId>javase</artifactId><version>3.4.1</version></dependency>

1.2、普通單一的二維碼

1.2.1、代碼示例

rHeight = 100; // 二維碼核心區域高度(不含邊距)int margin = 50;    // 邊距大小(像素)// 生成二維碼(無邊距)BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, qrWidth, qrHeight);BufferedImage qrImage = MatrixToImageWriter.toBufferedImage(bitMatrix);// 創建帶邊距的畫布int totalWidth = qrWidth ;int totalHeight = qrHeight ;BufferedImage finalImage = new BufferedImage(totalWidth, totalHeight, BufferedImage.TYPE_INT_RGB);Graphics2D graphics = finalImage.createGraphics();graphics.setColor(Color.WHITE);graphics.fillRect(0, 0, totalWidth, totalHeight); // 填充背景// 將二維碼繪制到畫布中央(可調整位置)graphics.drawImage(qrImage, 0, 0, null);graphics.dispose();// 保存圖像ImageIO.write(finalImage, "PNG", new File("測試.png"));}

1.2.2、效果

在這里插入圖片描述

1.3、帶文字的二維碼

1.3.1、代碼示例

/*** 二維碼屬性設置 * @param text 內容* @param width 寬度* @param height 高度* @return* @throws WriterException*/private static BitMatrix generateQRCode(String text, int width, int height) throws WriterException {Map<EncodeHintType, Object> hints = new HashMap<>();hints.put(EncodeHintType.CHARACTER_SET, "UTF-8"); //字符集
//        hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H); // 高容錯率hints.put(EncodeHintType.MARGIN, 0);// 禁用ZXing默認邊距return new MultiFormatWriter().encode(text, BarcodeFormat.QR_CODE, width, height, hints);}
//二維碼圖上帶字public static void contextLoads(String name,String path) {String textToEncode = name;int qrCodeWidth = 100;int qrCodeHeight = 100;int textPadding = 10; // 文本與二維碼之間的間距int textSize = 10; // 文本字體大小int totalHeight = qrCodeHeight  + textPadding;try {// 生成二維碼的BitMatrixBitMatrix bitMatrix = generateQRCode(textToEncode, qrCodeWidth, qrCodeHeight);// 將BitMatrix轉換為BufferedImageBufferedImage qrCodeImage = MatrixToImageWriter.toBufferedImage(bitMatrix);// 創建一個新的BufferedImage來容納二維碼和文本BufferedImage combinedImage = new BufferedImage(qrCodeWidth, totalHeight, BufferedImage.TYPE_INT_RGB);// 繪制二維碼到新的BufferedImage上Graphics2D g2d = combinedImage.createGraphics();g2d.setColor(Color.WHITE);g2d.fillRect(0, 0, qrCodeWidth, totalHeight);g2d.drawImage(qrCodeImage, 0, 0, null);// 設置文本樣式Font font = new Font("Arial", Font.PLAIN, textSize);g2d.setFont(font);g2d.setColor(Color.BLACK); // 文本顏色// 繪制文本到圖片下方FontMetrics metrics = g2d.getFontMetrics();int textX = (qrCodeWidth - metrics.stringWidth(textToEncode)) / 2;int textY = qrCodeHeight + textPadding;g2d.drawString(textToEncode, textX, textY);g2d.dispose();// 指定存儲圖片的路徑Path filePath = Paths.get(path+name+".png");// 確保文件路徑的父目錄存在filePath.getParent().toFile().mkdirs();// 保存圖片到文件ImageIO.write(combinedImage, "PNG", filePath.toFile());System.out.println("QR Code with text has been generated: " + filePath.toAbsolutePath());} catch (WriterException | IOException e) {e.printStackTrace();}}
 public static void main(String[] args) {// 指定存儲二維碼圖片的路徑String filePath = "D:/data/";contextLoads("C40851-WZ-A01",filePath);}

1.3.2、效果

在這里插入圖片描述

2、帶邊框的二維碼

因為我將生成的二維碼圖片導出到excel表格的時候,二維碼圖片覆蓋了excel表格的邊框,顯得很突兀,所以我考慮將二維碼圖片加個邊框,在導出的時候,二維碼邊框可以替代excel邊框。

2.1、代碼示例

我們在帶文字的二維碼生成類里面新增一些內容,并更詳細的增加了一些注釋。

    /*** 二維碼屬性設置 * @param text 內容* @param width 寬度* @param height 高度* @return* @throws WriterException*/private static BitMatrix generateQRCode(String text, int width, int height) throws WriterException {Map<EncodeHintType, Object> hints = new HashMap<>();hints.put(EncodeHintType.CHARACTER_SET, "UTF-8"); //字符集//默認邊距是為了二維碼能更好的識別,如果禁用默認邊距,為了能更好識別,最好要設置高容錯率
//        hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H); // 高容錯率hints.put(EncodeHintType.MARGIN, 0);// 禁用ZXing默認邊距 不禁用會有較多空白區域return new MultiFormatWriter().encode(text, BarcodeFormat.QR_CODE, width, height, hints);}
/*** 二維碼圖上帶字* @param name 二維碼 生成的內容 和 二維碼上的文字 及 二維碼的名稱* @param path 二維碼保存的路徑*/public static void contextLoads2(String name,String path) {int qrCodeWidth = 100;  //二維碼寬度int qrCodeHeight = 100;//二維碼高度int textPadding = 10; // 文本與二維碼之間的間距int textSize = 10; // 文本字體大小int borderWidth=1;//邊框大小int totalHeight = qrCodeHeight  + textPadding;//總高度 加上文本二維碼之間的間距try {// 生成二維碼的BitMatrixBitMatrix bitMatrix = generateQRCode(name, qrCodeWidth, qrCodeHeight);// 將BitMatrix轉換為BufferedImageBufferedImage qrCodeImage = MatrixToImageWriter.toBufferedImage(bitMatrix);// 3. 創建帶邊框的圖像int borderedSize = totalHeight + 2 * borderWidth;//因為borderedSize 包含了textPadding// 所以把寬度設置為borderedSize時,兩邊空白太多了,所以減掉了BufferedImage image = new BufferedImage(borderedSize-textPadding,borderedSize,BufferedImage.TYPE_INT_RGB);Graphics2D graphics = image.createGraphics();// 4. 繪制黑色邊框graphics.setColor(Color.BLACK);// 起始 x y 寬度 高度graphics.fillRect(0, 0, borderedSize, borderedSize);// 繪制二維碼到新的BufferedImage上Graphics2D g2d = image.createGraphics();g2d.setColor(Color.WHITE);// 起始 x y 寬度 高度g2d.fillRect(borderWidth, borderWidth, qrCodeWidth, totalHeight);g2d.drawImage(qrCodeImage, borderWidth, borderWidth, null);// 設置文本樣式Font font = new Font("Arial", Font.PLAIN, textSize);g2d.setFont(font);g2d.setColor(Color.BLACK); // 文本顏色// 繪制文本到圖片下方FontMetrics metrics = g2d.getFontMetrics();// x 居中位置int textX = (qrCodeWidth - metrics.stringWidth(name)) / 2 +borderWidth;int textY = qrCodeHeight + textPadding;g2d.drawString(name, textX, textY);g2d.dispose();// 指定存儲圖片的路徑Path filePath = Paths.get(path+name+".png");// 確保文件路徑的父目錄存在filePath.getParent().toFile().mkdirs();// 保存圖片到文件ImageIO.write(image, "PNG", filePath.toFile());System.out.println("QR Code with text has been generated: " + filePath.toAbsolutePath());} catch (WriterException | IOException e) {e.printStackTrace();}}

2.2、帶邊框的二維碼效果

在這里插入圖片描述


以上就是本文的全部內容,部分代碼是利用AI生成,然后再去修改成我想要的效果,如果有侵權的地方,還請聯系本人。
如果代碼有異常,或者有其他疑惑、或有新思路的同學,可以評論區留言。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/914154.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/914154.shtml
英文地址,請注明出處:http://en.pswp.cn/news/914154.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ARM單片機啟動流程(三)(棧空間綜合理解及相關實際應用)

文章目錄1、引出棧空間問題2、解決問題2.1、RAM空間2.2、RAM空間具體分布2.3、關于棧空間的使用2.4、棧溢出2.5、變量的消亡2.6、回到關鍵字static2.7、合法性的判斷1、引出棧空間問題 從static關鍵字引出該部分內容。 為什么能從static引出來&#xff1f; 在使用該關鍵字的…

【RK3568+PG2L50H開發板實驗例程】FPGA部分 | 鍵控LED實驗

本原創文章由深圳市小眼睛科技有限公司創作&#xff0c;版權歸本公司所有&#xff0c;如需轉載&#xff0c;需授權并注明出處&#xff08;www.meyesemi.com) 1.實驗簡介 實驗目的&#xff1a; 從創建工程到編寫代碼&#xff0c;完成引腳約束&#xff0c;最后生成 bit 流下載到…

【Python練習】039. 編寫一個函數,反轉一個單鏈表

039. 編寫一個函數,反轉一個單鏈表 039. 編寫一個函數,反轉一個單鏈表方法 1:迭代實現運行結果代碼解釋方法 2:遞歸實現運行結果代碼解釋選擇方法迭代法與遞歸法的區別039. 編寫一個函數,反轉一個單鏈表 在 Python 中,可以通過迭代或遞歸的方式反轉一個單鏈表。 方法 1…

BERT代碼簡單筆記

參考視頻&#xff1a;BERT代碼(源碼)從零解讀【Pytorch-手把手教你從零實現一個BERT源碼模型】_嗶哩嗶哩_bilibili 一、BertTokenizer BertTokenizer 是基于 WordPiece 算法的 BERT 分詞器&#xff0c;繼承自 PreTrainedTokenizer。 繼承的PretrainedTokenizer&#xff0c;具…

PID控制算法理論學習基礎——單級PID控制

這是一篇我在學習PID控制算法的過程中的學習記錄。在一開始學習PID的時候&#xff0c;我也看了市面上許多的資料&#xff0c;好的資料固然有&#xff0c;但是更多的是不知所云。&#xff08;有的是寫的太過深奧&#xff0c;有的則是照搬挪用&#xff0c;對原理則一問三不知&…

【Elasticsearch】function_score與rescore

它們倆都是用來“**干涉評分**”的&#xff0c;但**工作階段不同、性能開銷不同、能做的事也不同**。一句話總結&#xff1a;> **function_score** 在 **第一次算分** 時就動手腳&#xff1b; > **rescore** 在 **拿到 Top-N 結果后** 再“重新打分”。下面把“能干嘛”…

無廣告純凈體驗 WPS2016 精簡版:移除聯網模塊 + 非核心組件,古董電腦也能跑

各位辦公小能手們&#xff01;今天給你們介紹一款超神的辦公軟件——WPS2016精簡版&#xff01;它有多小呢&#xff1f;才33MB&#xff0c;簡直就是軟件界的小不點兒&#xff01;別看它個頭小&#xff0c;功能可一點兒都不含糊&#xff0c;文字、表格、演示這三大功能它全都有。…

《PyWin32:Python與Windows的橋梁,解鎖系統自動化新姿勢》

什么是 PyWin32在 Windows 平臺的 Python 開發領域中&#xff0c;PyWin32 是一個舉足輕重的庫&#xff0c;它為 Python 開發者打開了一扇直接通往 Windows 操作系統底層功能的大門。簡單來說&#xff0c;PyWin32 是用于 Python 訪問 Windows API&#xff08;Application Progra…

vite如何生成gzip,并在服務器上如何設置開啟

1. 安裝插件npm install vite-plugin-compression -D2. 在 vite.config.ts 中配置TypeScriptimport { defineConfig } from vite import compression from vite-plugin-compressionexport default defineConfig({plugins: [compression({algorithm: gzip,ext: .gz,threshold: 1…

1068萬預算!中國足協大模型項目招標,用AI技術驅動足球革命

中國足協啟動國際足聯“前進計劃”下的大數據模型項目&#xff0c;預算1068萬元。該項目將建立足球大數據分析平臺&#xff0c;利用AI技術為國家隊、青少年足球、業余球員及教練員裁判員提供精準數據分析服務&#xff0c;旨在通過科技手段提升中國足球競技水平。 中國足球迎來數…

AI產品經理面試寶典第12天:AI產品經理的思維與轉型路徑面試題與答法

多樣化思維:如何跳出單一框架解題? 面試官:AI產品常面臨復雜場景,請舉例說明你如何運用多樣化思維解決問題? 你的回答:我會從三個維度展開:多角度拆解需求本質,多層級融合思維模式,多變量尋找最優解。比如設計兒童教育機器人時,不僅考慮功能實現(技術層),還融入情…

vscode.window對象講解

一、vscode.window 核心架構圖 #mermaid-svg-fyCxPz1vVhkf96nE {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-fyCxPz1vVhkf96nE .error-icon{fill:#552222;}#mermaid-svg-fyCxPz1vVhkf96nE .error-text{fill:#5522…

為什么一個 @Transactional 注解就能開啟事務?揭秘 Spring AOP 的底層魔法

你是否也曾深陷在各種“額外”邏輯的泥潭&#xff0c;為了給一個核心業務方法增加日志、權限校驗或緩存&#xff0c;而不得不將這些非核心代碼硬塞進業務類中&#xff0c;導致代碼臃腫、職責不清&#xff1f;是時候用代理設計模式 (Proxy Design Pattern) 來解脫了&#xff01;…

《Spring 中上下文傳遞的那些事兒》Part 8:構建統一上下文框架設計與實現(實戰篇)

&#x1f4dd; Part 8&#xff1a;構建統一上下文框架設計與實現&#xff08;實戰篇&#xff09; 在實際項目中&#xff0c;我們往往需要處理多種上下文來源&#xff0c;例如&#xff1a; Web 請求上下文&#xff08;RequestContextHolder&#xff09;日志追蹤上下文&#xf…

配置驅動開發:初探零代碼構建嵌入式軟件配置工具

前言在嵌入式軟件開發中&#xff0c;硬件初始化與寄存器配置長期依賴人工編寫重復代碼。以STM32外設初始化為例&#xff0c;開發者需手動完成時鐘使能、引腳模式設置、參數配置等步驟&#xff0c;不僅耗時易錯&#xff08;如位掩碼寫反、模式枚舉值混淆&#xff09;&#xff0c…

Elasticsearch混合搜索深度解析(下):執行機制與完整流程

引言 在上篇中&#xff0c;我們發現了KNN結果通過SubSearch機制被保留的關鍵事實。本篇將繼續深入分析混合搜索的執行機制&#xff0c;揭示完整的處理流程&#xff0c;并解答之前的所有疑惑。 深入源碼分析 1. SubSearch的執行機制 1.1 KnnScoreDocQueryBuilder的實現 KNN結果被…

Apache HTTP Server 從安裝到配置

一、Apache 是什么&#xff1f;Apache&#xff08;全稱 Apache HTTP Server&#xff09;是當前最流行的開源Web服務器軟件之一&#xff0c;由Apache軟件基金會維護。它以穩定性高、模塊化設計和靈活的配置著稱&#xff0c;支持Linux、Windows等多平臺&#xff0c;是搭建個人博客…

php中調用對象的方法可以使用array($object, ‘methodName‘)?

是的&#xff0c;在PHP中&#xff0c;array($object, methodName) 是一種標準的回調語法&#xff0c;用于表示“調用某個對象的特定方法”。這種語法可以被許多函數&#xff08;如 call_user_func()、call_user_func_array()、usort() 等&#xff09;識別并執行。 語法原理 在P…

【設計模式】單例模式 餓漢式單例與懶漢式單例

單例模式&#xff08;Singleton Pattern&#xff09;詳解一、單例模式簡介 單例模式&#xff08;Singleton Pattern&#xff09; 是一種 創建型設計模式&#xff0c;它確保一個類只有一個實例&#xff0c;并提供一個全局訪問點來獲取這個實例。&#xff08;對象創建型模式&…

vue3 el-table 行數據沾滿格自動換行

在使用 Vue 3 結合 Element Plus 的 <el-table> 組件時&#xff0c;如果你希望當表格中的行數據文本過長時能夠自動換行&#xff0c;而不是溢出到其他單元格或簡單地截斷&#xff0c;你可以通過以下幾種方式來實現&#xff1a;方法 1&#xff1a;使用 CSS最簡單的方法是通…