日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java使用zxing生成二维码,可带logo和底部文字

發(fā)布時間:2024/1/18 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java使用zxing生成二维码,可带logo和底部文字 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

java使用zxing生成二維碼,可帶logo和底部文字

springboot中整合zxing生成二維碼

一、導入依賴

<properties><zxing.version>3.4.0</zxing.version> </properties><!--二維碼依賴--><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>${zxing.version}</version></dependency><dependency><groupId>com.google.zxing</groupId><artifactId>javase</artifactId><version>${zxing.version}</version></dependency>

二、二維碼工具類封裝QRCodeUtil.java,支持生成BufferedImage 和byte[]

import com.google.zxing.BarcodeFormat; import com.google.zxing.EncodeHintType; import com.google.zxing.common.BitMatrix; import com.google.zxing.qrcode.QRCodeWriter; import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; import lombok.SneakyThrows; import org.springframework.core.io.ClassPathResource; import org.springframework.util.StringUtils; import sun.font.FontDesignMetrics;import javax.imageio.ImageIO; import java.awt.*; import java.awt.font.FontRenderContext; import java.awt.font.LineMetrics; import java.awt.geom.RoundRectangle2D; import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; import java.io.InputStream; import java.util.HashMap;/*** 二維碼生成工具類* Created by chenzan on 2022/09/19*/ public class QRCodeUtil {private static final int QRCODE_SIZE = 320; // 二維碼尺寸,寬度和高度均是320private static final String FORMAT_TYPE = "PNG"; // 二維碼圖片類型/*** 默認需要logo,無底部文字* 返回 BufferedImage 可以使用ImageIO.write(BufferedImage, "png", outputStream);輸出** @param dataStr* @return 返回 BufferedImage 可以使用ImageIO.write(BufferedImage, "png", outputStream);輸出*/@SneakyThrowspublic static BufferedImage getQRCodeImage(String dataStr) {BufferedImage bufferedImage = getQRCodeImage(dataStr, true, null);return bufferedImage;}/*** 默認需要logo,無底部文字** @param dataStr* @return 返回字節(jié)數(shù)組*/@SneakyThrowspublic static byte[] getQRCodeByte(String dataStr) {BufferedImage bufferedImage = getQRCodeImage(dataStr, true, null);ByteArrayOutputStream outputStream = new ByteArrayOutputStream();ImageIO.write(bufferedImage, FORMAT_TYPE, outputStream);byte[] byteData = outputStream.toByteArray();return byteData;}/*** 默認需要logo,包含底部文字 文字為空則不顯示文字* 返回 BufferedImage 可以使用ImageIO.write(BufferedImage, "png", outputStream);輸出** @param dataStr* @return*/@SneakyThrowspublic static BufferedImage getQRCodeImage(String dataStr, String bottomText) {BufferedImage bufferedImage = getQRCodeImage(dataStr, true, bottomText);return bufferedImage;}/*** 默認需要logo,包含底部文字 文字為空則不顯示文字** @param dataStr* @return 返回字節(jié)數(shù)組*/@SneakyThrowspublic static byte[] getQRCodeByte(String dataStr, String bottomText) {BufferedImage bufferedImage = getQRCodeImage(dataStr, true, bottomText);ByteArrayOutputStream outputStream = new ByteArrayOutputStream();ImageIO.write(bufferedImage, FORMAT_TYPE, outputStream);byte[] byteData = outputStream.toByteArray();return byteData;}/*** 獲取二維碼圖片** @param dataStr 二維碼內容* @param needLogo 是否需要添加logo* @param bottomText 底部文字 為空則不顯示* @return*/@SneakyThrowspublic static BufferedImage getQRCodeImage(String dataStr, boolean needLogo, String bottomText) {if (dataStr == null) {throw new RuntimeException("未包含任何信息");}HashMap<EncodeHintType, Object> hints = new HashMap<>();hints.put(EncodeHintType.CHARACTER_SET, "utf-8"); //定義內容字符集的編碼hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.L); //定義糾錯等級hints.put(EncodeHintType.MARGIN, 1);QRCodeWriter qrCodeWriter = new QRCodeWriter();BitMatrix bitMatrix = qrCodeWriter.encode(dataStr, BarcodeFormat.QR_CODE, QRCODE_SIZE, QRCODE_SIZE, hints);int width = bitMatrix.getWidth();int height = bitMatrix.getHeight();int tempHeight = height;if (StringUtils.hasText(bottomText)) {tempHeight = tempHeight + 12;}BufferedImage image = new BufferedImage(width, tempHeight, BufferedImage.TYPE_INT_RGB);for (int x = 0; x < width; x++) {for (int y = 0; y < height; y++) {image.setRGB(x, y, bitMatrix.get(x, y) ? 0xFF000000 : 0xFFFFFFFF);}}// 判斷是否添加logoif (needLogo) {insertLogoImage(image);}// 判斷是否添加底部文字if (StringUtils.hasText(bottomText)) {addFontImage(image, bottomText);}return image;}/*** 插入logo圖片** @param source 二維碼圖片* @throws Exception*/private static void insertLogoImage(BufferedImage source) throws Exception {// 默認logo放于resource/static/image目錄下ClassPathResource classPathResource = new ClassPathResource("static/image/logo.png");InputStream inputStream = classPathResource.getInputStream();if (inputStream == null || inputStream.available() == 0) {return;}Image src = ImageIO.read(inputStream);int width = 30;int height = 30;Image image = src.getScaledInstance(width, height, Image.SCALE_SMOOTH);BufferedImage tag = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);Graphics g = tag.getGraphics();g.drawImage(image, 0, 0, null); // 繪制縮小后的圖g.dispose();src = image;// 插入LOGOGraphics2D graph = source.createGraphics();int x = (QRCODE_SIZE - width) / 2;int y = (QRCODE_SIZE - height) / 2;graph.drawImage(src, x, y, width, height, null);Shape shape = new RoundRectangle2D.Float(x, y, width, width, 6, 6);graph.setStroke(new BasicStroke(3f));graph.draw(shape);graph.dispose();}private static void addFontImage(BufferedImage source, String declareText) {//生成imageint defineWidth = QRCODE_SIZE;int defineHeight = 20;BufferedImage textImage = new BufferedImage(defineWidth, defineHeight, BufferedImage.TYPE_INT_RGB);Graphics2D g2 = (Graphics2D) textImage.getGraphics();//開啟文字抗鋸齒g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);g2.setBackground(Color.WHITE);g2.clearRect(0, 0, defineWidth, defineHeight);g2.setPaint(Color.BLACK);FontRenderContext context = g2.getFontRenderContext();//部署linux需要注意 linux無此字體會顯示方塊Font font = new Font("宋體", Font.BOLD, 15);g2.setFont(font);LineMetrics lineMetrics = font.getLineMetrics(declareText, context);FontMetrics fontMetrics = FontDesignMetrics.getMetrics(font);float offset = (defineWidth - fontMetrics.stringWidth(declareText)) / 2;float y = (defineHeight + lineMetrics.getAscent() - lineMetrics.getDescent() - lineMetrics.getLeading()) / 2;g2.drawString(declareText, (int) offset, (int) y);Graphics2D graph = source.createGraphics();//開啟文字抗鋸齒graph.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);//添加imageint width = textImage.getWidth(null);int height = textImage.getHeight(null);Image src = textImage;graph.drawImage(src, 0, QRCODE_SIZE - 8, width, height, Color.WHITE, null);graph.dispose();}}

三、使用

//1、生成帶logo和底部文字得二維碼@SneakyThrows@GetMapping("/getQrCode1")public void getQrCode1(HttpServletResponse response) {ServletOutputStream os = response.getOutputStream();BufferedImage bufferedImage = QRCodeUtil.getQRCodeImage("test", "底部文字");response.setContentType("image/png");ImageIO.write(bufferedImage,"png",os);}//2、生成不帶logo和底部文字得二維碼@SneakyThrows@GetMapping("/getQrCode2")public void getQrCode2(HttpServletResponse response) {ServletOutputStream os = response.getOutputStream();BufferedImage bufferedImage = QRCodeUtil.getQRCodeImage("test", false);response.setContentType("image/png");ImageIO.write(bufferedImage,"png",os);} //3、生成默認帶logo不帶底部文字得二維碼@SneakyThrows@GetMapping("/getQrCode3")public void getQrCode3(HttpServletResponse response) {ServletOutputStream os = response.getOutputStream();BufferedImage bufferedImage = QRCodeUtil.generateQRCodeImage("test");response.setContentType("image/png");ImageIO.write(bufferedImage,"png",os);} //3、生成不帶logo帶底部文字得二維碼@SneakyThrows@GetMapping("/getQrCode3")public void getQrCode3(HttpServletResponse response) {ServletOutputStream os = response.getOutputStream();BufferedImage bufferedImage = QRCodeUtil.getQRCodeImage("test",false, "底部文字");response.setContentType("image/png");ImageIO.write(bufferedImage,"png",os);}

直接請求即可得到二維碼圖片

1、logo加文字2 、只logo3、無logo無文字4、只文字

四、文字在linux下得展示問題

在jdk中加入指定的字體(宋體)

  • 在jdk目錄(/usr/local/jdk1.8.0_331/jre/lib/fonts)下創(chuàng)建目錄fallback

  • 將window下的宋體字體放到此目錄下

  • 字體文件位于:C:\Windows\Fonts

    總結

    以上是生活随笔為你收集整理的java使用zxing生成二维码,可带logo和底部文字的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 亚洲免费在线视频观看 | 国产99精品视频 | 懂色av一区二区三区蜜臀 | 日韩久久久久久久久久 | 午夜精品国产精品大乳美女 | 少妇人妻偷人精品无码视频新浪 | 成人网站免费观看 | 国产精品久久久久久久久借妻 | 韩国妻子的朋友 | 黄色一级大片在线观看 | 国产精品99精品久久免费 | 成av人在线观看 | 97精品国产 | 看了让人下面流水的视频 | 国产裸体美女永久免费无遮挡 | 婷婷五月小说 | 91精品视频一区二区三区 | 一区二区三区国 | 色福利视频 | 国模福利视频 | 2020亚洲天堂 | 国产视频手机在线 | 天天综合中文字幕 | 私拍在线 | 色屁屁一区二区 | 国产拍拍拍拍拍拍拍拍拍拍拍拍拍 | 欧美精品亚洲精品日韩精品 | 日本一本久 | jzz在线观看 | 色噜| 欧美日韩人妻精品一区 | 亚洲人做受 | 国产男女猛烈无遮挡a片漫画 | 国产美女福利视频 | 麻豆视频免费看 | 日韩精品一二三区 | 一级黄色短视频 | 特黄视频| 哺乳喂奶一二三区乳 | 一区=区三区乱码 | 色综合久久88色综合天天 | 伊人激情 | 99久久久 | 女女互慰吃奶互揉调教捆绑 | 午夜精品久久99蜜桃的功能介绍 | 69精品无码成人久久久久久 | 受虐m奴xxx在线观看 | 男女偷爱性视频刺激 | 夜晚福利视频 | chinese精品自拍hd| 最新色站 | 咪咪色图 | 97在线精品视频 | 在线播放网址 | 天天操天天撸 | 色噜噜日韩精品欧美一区二区 | 国产精品久久久久久亚洲 | 日本超碰在线 | 三级av网站 | 日韩一级片 | 91色视频 | 91精品国产自产91精品 | 国产精品69毛片高清亚洲 | 超碰婷婷| 免费古装一级淫片潘金莲 | 强行挺进白丝老师翘臀网站 | 亚洲蜜桃精久久久久久久久久久久 | 欧美第十页| 少妇脱了内裤让我添 | 国产精品久久久久不卡 | 国产永久免费观看 | 欧美性另类 | 亚洲精品伊人 | 蜜臀久久精品久久久用户群体 | 成人午夜视频精品一区 | 尤物精品在线观看 | 国产不卡一 | 亚洲无码久久久久久久 | 人与动物黄色片 | 婷婷射| 国产精品入口久久 | 欧美在线专区 | 欧美日韩a级 | aa爱做片免费 | 亚洲一区二区三区电影在线观看 | 国产aⅴ精品一区二区果冻 台湾性生生活1 | 美女张开腿让男人桶爽 | 99re国产精品| 日本在线播放 | 不卡视频一区二区 | 欧美性啪啪 | 成人看片网站 | 日韩免费观看av | 涩五月婷婷 | 国产精品综合网 | 亚洲最新 | 黄色中文视频 | 欧美精选一区 | 97视频网址 |