Java 实现二维码及有Logo 的二维码(SpringMVC+Zxing+Jsp)
来源:互联网 发布:探险家时光相册软件 编辑:程序博客网 时间:2024/06/01 10:15
需求:我们需要把订单信息生成二维码及有Logo 的二维码。
先看下效果图
提交订单
生成二维码
解析二维码
Zxing简介
本次我们使用优秀的开源利器– ZXing,相比而言它更加灵活方便,可以实现多种编码格式。
官网:http://code.google.com/p/zxing/
当然我们需要用到了源码中core和javase下面的相关的架包:
core-3.2.0.jar
javase-3.2.0.jar
都准备好了我们开始编写了。。。
代码编写
SpringMVC 配置可以看我的 SpringMVC 案例 :
Java 实现图片水印之文字水印(SpringMVC + Jsp)
Java 实现图片水印之水印图片(SpringMVC + Jsp)
不多说了。。
1.先写Service类
生成二维码
CoderService.java
package com.wenteryan.service;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.OutputStream;import java.util.HashMap;import java.util.Map;import org.springframework.stereotype.Service;import com.google.zxing.BarcodeFormat;import com.google.zxing.EncodeHintType;import com.google.zxing.MultiFormatWriter;import com.google.zxing.client.j2se.MatrixToImageWriter;import com.google.zxing.common.BitMatrix;import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;@Servicepublic class CoderService { public String encode(String contents, int width, int height, String uploadPath, String realUploadPath, String imageName) { //生成条形码时的一些配置 Map<EncodeHintType, Object> hints = new HashMap<EncodeHintType, Object>(); // 指定纠错等级,纠错级别(L 7%、M 15%、Q 25%、H 30%) hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H); // 内容所使用字符集编码 hints.put(EncodeHintType.CHARACTER_SET, "utf-8"); OutputStream out=null; try { if(realUploadPath!=null&&realUploadPath!=""){ out = new FileOutputStream(realUploadPath+"/"+imageName); } } catch (FileNotFoundException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } BitMatrix bitMatrix; try { // 生成二维码 bitMatrix = new MultiFormatWriter().encode(contents, BarcodeFormat.QR_CODE, width, height, hints); MatrixToImageWriter.writeToStream(bitMatrix, "png", out); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return uploadPath+"/"+imageName ; } }
添加Logo
LogoConfig .java
package com.wenteryan.service;import java.awt.BasicStroke;import java.awt.Color;import java.awt.Graphics2D;import java.awt.Image;import java.awt.geom.RoundRectangle2D;import java.awt.image.BufferedImage;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.OutputStream;import javax.imageio.ImageIO;import org.springframework.stereotype.Service;import com.sun.image.codec.jpeg.JPEGCodec;import com.sun.image.codec.jpeg.JPEGImageEncoder;@Servicepublic class LogoConfig { public String LogoMatrix(File image, String uploadPath, String realUploadPath, String imgPath) { /** * 读取二维码图片,并构建绘图对象 */ OutputStream os = null ; String logoFileName = "logo_"+imgPath ; try { Image image2 = ImageIO.read(image) ; int width = image2.getWidth(null) ; int height = image2.getHeight(null) ; BufferedImage bufferImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB) ; //BufferedImage bufferImage =ImageIO.read(image) ; Graphics2D g2 = bufferImage.createGraphics(); g2.drawImage(image2, 0, 0, width, height, null) ; int matrixWidth = bufferImage.getWidth(); int matrixHeigh = bufferImage.getHeight(); //读取Logo图片 BufferedImage logo= ImageIO.read(new File(realUploadPath+"/"+"logo.jpg")); //开始绘制图片 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.dispose(); bufferImage.flush() ; os = new FileOutputStream(realUploadPath+"/"+logoFileName) ; JPEGImageEncoder en = JPEGCodec.createJPEGEncoder(os) ; en.encode(bufferImage) ; } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { if(os!=null) { try { os.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } return uploadPath+"/"+logoFileName ; } }
解码
ZxingDecoderService .java
package com.wenteryan.service;import java.awt.image.BufferedImage;import java.io.File;import java.util.HashMap;import java.util.Map;import javax.imageio.ImageIO;import org.springframework.stereotype.Service;import com.google.zxing.BinaryBitmap;import com.google.zxing.DecodeHintType;import com.google.zxing.LuminanceSource;import com.google.zxing.MultiFormatReader;import com.google.zxing.Result;import com.google.zxing.client.j2se.BufferedImageLuminanceSource;import com.google.zxing.common.HybridBinarizer;@Servicepublic class ZxingDecoderService { public String zxingdecode(String realImgPath) { BufferedImage image = null; Result result = null; try { image = ImageIO.read(new File(realImgPath)); if (image == null) { System.out.println("the decode image may be not exit."); } LuminanceSource source = new BufferedImageLuminanceSource(image); BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source)); Map<DecodeHintType, Object> hints = new HashMap<DecodeHintType, Object>(); hints.put(DecodeHintType.CHARACTER_SET, "utf-8"); result = new MultiFormatReader().decode(bitmap, hints); return result.getText(); } catch (Exception e) { e.printStackTrace(); } return result.getText() ; }}
2.写实现类
package com.wenteryan.action;import java.io.File;import javax.servlet.http.HttpSession;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.servlet.ModelAndView;import com.wenteryan.service.CoderService;import com.wenteryan.service.LogoConfig;import com.wenteryan.service.ZxingDecoderService;@Controllerpublic class ZxingEncoderAction { private LogoConfig logiconfig ; private ZxingDecoderService zxingDecodeService ; private CoderService coderService ; @RequestMapping(value="/zxingdecode", method=RequestMethod.GET) public ModelAndView zxingdecode(@RequestParam("realImgPath") String realImgPath, HttpSession session) { String uploadPath = "/images" ; String realUploadPath = session.getServletContext().getRealPath(uploadPath) ; String imgPath = realUploadPath+"/"+realImgPath ; String result = zxingDecodeService.zxingdecode(imgPath) ; ModelAndView ret = new ModelAndView() ; ret.addObject("result", result) ; ret.setViewName("zxingdecode"); return ret ; } @RequestMapping(value="/zxingcoder", method=RequestMethod.GET) public ModelAndView watermark(HttpSession session) throws Exception { String uploadPath = "/images" ; String realUploadPath = session.getServletContext().getRealPath(uploadPath) ; String imageName = "12345"+".png" ; // 模拟订单详情 String contents = "订单编号:20160512082345"+"\n"+"订单金额:¥ 2050.00"+"\n"+"支付方式:预存款"+"\n"+"配送方式:京东快递" ; int width = 300; int height = 300; String zxingImage = coderService.encode(contents, width, height, uploadPath, realUploadPath, imageName); File image = new File(realUploadPath+"/"+imageName); String logoImageUrl = logiconfig.LogoMatrix(image, uploadPath, realUploadPath, imageName) ; ModelAndView ret = new ModelAndView() ; ret.addObject("imageUrl", zxingImage) ; ret.addObject("imageName", imageName) ; ret.addObject("logoImageUrl", logoImageUrl) ; ret.setViewName("zxingcoder"); return ret ; } @Autowired public void setLogiconfig(LogoConfig logiconfig) { this.logiconfig = logiconfig; } @Autowired public void setZxingDecodeService(ZxingDecoderService zxingDecodeService) { this.zxingDecodeService = zxingDecodeService; } @Autowired public void setCoderService(CoderService coderService) { this.coderService = coderService; } }
3. 编写页面
index.jsp
<div class="panel-body"> <h2>请核对你的订单信息</h2> <table class="table table-bordered table-hover"> <thead> </thead> <tbody> <tr><td>订单编号:</td><td>20160512082345</td></tr> <tr><td>订单金额:</td><td>¥ 2050.00</td></tr> <tr><td>支付方式:</td><td>预存款</td></tr> <tr><td>配送方式:</td><td>京东快递</td></tr> </tbody> </table> <br> <a href="zxingcoder" class="btn btn-success" type="submit">如果无误,确认提交</a> </div>
zxingcoder.jsp
<div class="panel-heading"><h2>二维码与有Logo 的二维码</h2></div> <div class="panel-body"> <div class="col-md-6" align="center"> <a href="zxingdecode?realImgPath=${imageName }"> <img class="img-responsive img-rounded" src="${pageContext.request.contextPath}${imageUrl }"/> <b class="btn btn-success" >我要解码</b> </a> </div> <div class="col-md-6" align="center"> <a href="zxingdecode"> <img class="img-responsive img-rounded" src="${pageContext.request.contextPath}${logoImageUrl }"/> <b class="btn btn-success" >我要解码</b> </a> </div> <div class="col-md-12"> <br> <a class="btn btn-warning" href="${pageContext.request.contextPath }">返回</a> </div> </div>
zxingdecode.jsp
<div class="panel-heading"><h2>二维码解码数据</h2></div> <div class="panel-body"> <div class="col-md-12" align="center"> <br><br> <p>${result }</p> </div> <div class="col-md-12"> <br> <a class="btn btn-warning" href="${pageContext.request.contextPath }">返回</a> </div> </div>
总结
二维码每个人都一定不陌生,尤其是在支付宝和微信的努力下,相信每个人都或多或少的使用过”扫一扫“,这个功能而作为开发者,不管是练习还是研究或者是公司的项目,大家都应该有过二维码的开发经验。
0 0
- Java 实现二维码及有Logo 的二维码(SpringMVC+Zxing+Jsp)
- Java:生成带logo的二维码(ZXing)
- 二维码及带logo二维码的生成和解析-Zxing
- Java二维码工具类(使用zxing实现,可支持logo)
- Java二维码工具类(使用zxing实现,可支持logo)
- Java二维码工具类(使用zxing实现,可支持logo)
- (转)java zxing 二维码工具类,中间带Logo 的
- java使用zxing生成带logo的二维码图片
- java使用zxing生成带logo的二维码图片
- java实现二维码([带]logo)的绘制和解析(zxing by google)
- java实现二维码(带logo)的绘制和解析(zxing by google)
- java实现二维码([带]logo)的绘制和解析(zxing by google)
- java zxing二维码(可带logo)、条形码生成解析
- java生成带logo的二维码及前端显示二维码
- Zxing.jar生成带有logo的二维码
- 使用Zxing生成带logo的二维码
- 使用Zxing生成带有logo的二维码
- 使用ZXing实现二维码的扫描和生成带logo的二维码
- Hadoop生态上几个技术的关系与区别:hive、pig、hbase 关系与区别
- 蓝桥杯 BASIC_03 基础练习 字母图形
- wke属性记录
- 简单的使用HttpClient访问网络
- Java LinkedHashMap工作原理及实现(一)
- Java 实现二维码及有Logo 的二维码(SpringMVC+Zxing+Jsp)
- Sqlite中文排序研究
- UIScrollView添加AutoLayout约束的坑
- intent 的URI功能示例总汇
- hdoj ztr loves substring 5677 (多重背包+母函数)好题
- 单击图片刷新验证码
- 中文搜索引擎技术揭密:网络蜘蛛
- Android开发笔记之简易画画板的制作
- MSM搭建(Memcached_Session_Manager)--解决集群session共享