您好,登錄后才能下訂單哦!
本篇內(nèi)容介紹了“java zxing怎么合成復(fù)雜二維碼圖片”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細閱讀,能夠?qū)W有所成!
引入zxing成熟的二維碼生成接口,生成標(biāo)準(zhǔn)二維碼文件,通過java圖形圖像處理API為二維碼添加相關(guān)文字描述,根據(jù)需要,可以為合成后的圖片添加相關(guān)背景。示例如下圖所示:
1.先拿點位圖來說,生成二維碼圖片核心代碼如下
/** * 定義二維碼的參數(shù) */ HashMap<EncodeHintType, Object> hints = new HashMap(); //指定字符編碼為“utf-8” hints.put(EncodeHintType.CHARACTER_SET, "utf-8"); //指定二維碼的糾錯等級為中級 hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H); //設(shè)置圖片的邊距 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();//設(shè)置文字 g2.setColor(Color.BLACK); g2.setBackground(Color.WHITE); g2.clearRect(0,0,QRCODE_WIDTH, IMAGE_HEIGHT); //設(shè)置頂部文本并計算坐標(biāo) // 保證操作系統(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); // 設(shè)置底部文字字體并計算坐標(biāo) // 保證操作系統(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; }
知識點 : 底部文字長度會變,目前設(shè)計只放一行文字,所以根據(jù)字數(shù)多少會動態(tài)改變文字大小在一個合理區(qū)間(不至于太小無法識別),使用FontMetrics 對象,這個點會對多數(shù)同學(xué)有幫助
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)建畫布,需要設(shè)置畫布的寬、高,單位應(yīng)該是像素
BufferedImage tag = new BufferedImage(QRCODE_WIDTH, IMAGE_HEIGHT, BufferedImage.TYPE_INT_RGB);
第二步: 在畫布上創(chuàng)建圖形對象Graphics2D,可以根據(jù)你對圖像知識點的了解設(shè)置如背景、前景、邊框、寬度等信息
Graphics2D g2 = tag.createGraphics();//設(shè)置文字
第三步: 合成圖片,過程中的圖片添加順序、圖片大小、坐標(biāo)位置會影響最終的呈現(xiàn)效果,如果最終效果沒有達到設(shè)計需求,調(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("二維碼臨時路徑不存在!"); } /** * 讀取背景圖片,并構(gòu)建繪圖對象--畫布 */ 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)二維碼與背景比例嚴(yán)重失調(diào)或二維碼顯示不完整
二維碼添加文字亂碼 開發(fā)環(huán)境(windows),測試環(huán)境(centos 服務(wù)器版)。本地開發(fā)測試沒有任何問題,打包部署至服務(wù)器后所有中文字符出現(xiàn)亂碼(各種轉(zhuǎn)碼,字體設(shè)置,調(diào)試整了很久),問題仍然沒有任何變化。最終靈光一現(xiàn)懷疑是系統(tǒng)字體問題,查了測試環(huán)境(centos)字體信息確實沒有“宋體”,設(shè)置成系統(tǒng)自有或默認的字體,問題還在。最終從(c:\windows\fonts\simsun.ttc)開發(fā)系統(tǒng)中copy字體至測試系統(tǒng)(JAVA_HOME/jre/libs/fonts)中后重啟應(yīng)用,問題得到完美解決。系統(tǒng)安裝部署需要準(zhǔn)備字體有點麻煩,不知道還有沒有更好的辦法,字體有邏輯字體和物理字體,愛、先這樣吧。
背景圖片加載問題 項目為springboot項目,背景圖片存放在resources文件夾下,本地開發(fā)測試未見異常,打包部署至服務(wù)器后背景圖片無法找到,原始代碼如下
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怎么合成復(fù)雜二維碼圖片”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。