哎呀,看了那麼多博客,搬運了那麼多代碼,第一次自己寫博客,我發現即使會使用某技術了,但是要表達、轉述出來還是不簡單的。希望我能堅持下去哈。 為什麼使用Zxing?Google 名氣大啊,其他我也不瞭解啊。 上手還是很容易的,引入jar 包後十幾代碼的事。 1、在pom.xml 引入依賴 2、後臺co ...
哎呀,看了那麼多博客,搬運了那麼多代碼,第一次自己寫博客,我發現即使會使用某技術了,但是要表達、轉述出來還是不簡單的。希望我能堅持下去哈。
為什麼使用Zxing?Google 名氣大啊,其他我也不瞭解啊。
上手還是很容易的,引入jar 包後十幾代碼的事。
1、在pom.xml 引入依賴
<!-- 條形碼、二維碼生成 --> <dependency> <groupId>com.google.zxing</groupId> <artifactId>core</artifactId> <version>3.0.0</version> </dependency> <dependency> <groupId>com.google.zxing</groupId> <artifactId>javase</artifactId> <version>3.0.0</version> </dependency>
2、後臺controler層 繪製輸出二維碼代碼@RequestMapping("createQRCode") public String createQRCode(HttpServletRequest request, HttpServletResponse response){
//如果當前用戶有渠道,則生成二維碼 String id = UserUtils.getUser().getId(); LoanChannel channelByUserId = loanChannelService.getChannelByUserId(id); if (channelByUserId!=null){ JSONObject json = new JSONObject(); json.put( "channelName", channelByUserId.getName()); json.put("channelNo", channelByUserId.getChannelNo()); String content = json.toJSONString();// 內容 int width = 210; // 圖像寬度 int height = 200; // 圖像高度 String format = "png";// 圖像類型 Map<EncodeHintType, Object> hints = new HashMap<EncodeHintType, Object>(); hints.put(EncodeHintType.CHARACTER_SET, "UTF-8"); //設置糾錯級別 hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H); BitMatrix bitMatrix = null;// 生成矩陣 try { bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, width, height, hints); /** 定義一張空白緩衝流圖片 */ BufferedImage image = new BufferedImage(bitMatrix.getWidth(), bitMatrix.getHeight(), BufferedImage.TYPE_INT_RGB); /** 迴圈二維碼位元組轉化對象中所有點 矩陣轉image*/ for (int x = 0; x < bitMatrix.getWidth(); x++){ for (int y = 0; y < bitMatrix.getHeight(); y++){ /** 獲取其中一點,判斷它是黑色還是白色 true:黑色 false:白色 */ int rgb = bitMatrix.get(x, y) ? 0x000000 : 0xffffff; /** 在空白圖片繪製一點 */ image.setRGB(x, y, rgb); } }
//載入logo InputStream stream = this.getClass().getResourceAsStream("/images/logo.png"); BufferedImage logo = ImageIO.read(stream);
//嵌套logo BufferedImage logoMatrix = LogoConfig.LogoMatrix(image, logo); ImageIO.write(logoMatrix,format,response.getOutputStream()); } catch (WriterException e) { logger.info("輸出二維碼錯誤",e); e.printStackTrace(); } catch (IOException e) { logger.info("輸出二維碼錯誤",e); e.printStackTrace(); } String data=channelByUserId.getName()+"-"+channelByUserId.getChannelNo(); return data; } return ""; }
3、二維碼嵌套logo處理類
public class LogoConfig{ /** * 設置 logo * @param matrixImage 源二維碼圖片 * @return 返回帶有logo的二維碼圖片 * @throws IOException * @author Administrator sangwenhao */ public static BufferedImage LogoMatrix(BufferedImage matrixImage, BufferedImage logo) throws IOException{ /** * 讀取二維碼圖片,並構建繪圖對象 */ Graphics2D g2 = matrixImage.createGraphics(); int matrixWidth = matrixImage.getWidth(); int matrixHeigh = matrixImage.getHeight(); //開始繪製圖片 g2.drawImage(logo,matrixWidth/5*2,matrixHeigh/5*2, matrixWidth/5, matrixHeigh/5, null);//繪製 BasicStroke stroke = new BasicStroke(5,BasicStroke.CAP_ROUND,BasicStroke.JOIN_ROUND); g2.setStroke(stroke);// 設置筆畫對象 //指定弧度的圓角矩形 RoundRectangle2D.Float round = new RoundRectangle2D.Float(matrixWidth/5*2, matrixHeigh/5*2, matrixWidth/5, matrixHeigh/5,20,20); g2.setColor(Color.white); g2.draw(round);// 繪製圓弧矩形 //設置logo 有一道灰色邊框 BasicStroke stroke2 = new BasicStroke(1,BasicStroke.CAP_ROUND,BasicStroke.JOIN_ROUND); g2.setStroke(stroke2);// 設置筆畫對象 RoundRectangle2D.Float round2 = new RoundRectangle2D.Float(matrixWidth/5*2+2, matrixHeigh/5*2+2, matrixWidth/5-4, matrixHeigh/5-4,20,20); g2.setColor(new Color(128,128,128)); g2.draw(round2);// 繪製圓弧矩形*/ g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); matrixImage.flush() ; g2.dispose(); return matrixImage ; } }
4、前端使用 a標簽href 使用圖片地址可以直接完成圖片的點擊下載,download 屬性用於指定保存的文件名
img src 由後臺輸出
<a id="fileName" href="${ctx}/loan/loanChannel/createQRCode" download="渠道.png"> <img src="${ctx}/loan/loanChannel/createQRCode"> </a>
5、效果