pom支持:
<!-- 二维码支持包 start-->
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>core</artifactId>
<version>3.2.0</version>
</dependency> <dependency>
<groupId>com.google.zxing</groupId>
<artifactId>javase</artifactId>
<version>3.2.0</version>
</dependency>
<!-- 二维码支持包 end--> 工具类支持:
package com.example.demo.dao.qrcode; import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.WriterException;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity; import javax.imageio.ImageIO;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.util.Hashtable; /**
* @author jin.tang
* @Title: springbootdemo
* @Package com.example.demo.dao.qrcode
* @Description: java web二维码生成器
* @date 2017/12/25
*/
@Slf4j
public class QRCodeUtil { /**
* 方式一:流的方式直接生成web版本二维码
* 默认的二维码外观(可设置高宽)
* @param url 要生成二维码的路径
* @param response response对象
* @param width 二维码宽度
* @param height 二维码高度
* @throws IOException
*/
public static void getTwoDimension(String url, HttpServletResponse response, int width, int height) throws IOException {
if (url != null && !"".equals(url)) {
ServletOutputStream stream = null;
try {
stream = response.getOutputStream();
QRCodeWriter writer = new QRCodeWriter();
BitMatrix m = writer.encode(url, BarcodeFormat.QR_CODE, height, width);
MatrixToImageWriter.writeToStream(m, "png", stream);
} catch (WriterException e) {
e.printStackTrace();
log.error("生成二维码失败!");
} finally {
if (stream != null) {
stream.flush();
stream.close();
}
}
}
} /**
* 方式二:返回ResponseEntity的方式显示二维码
* 可设置二维码外观颜色,logo图片
* @param url 二维码对于URL
* @param width 二维码宽
* @param height 二维码高
* @param format 二维码格式
* @param logPath logo图片路径
* @param needLogo 二维码是否需要生成logo
* @return
* @throws WriterException
* @throws IOException
*/
// 直接在页面显示
public static ResponseEntity<byte[]> getResponseEntity(String url, String logPath, boolean needLogo,String format,int width,int height)throws Exception {
BufferedImage image = QRCodeUtil.createImage(url, logPath,needLogo,width,height); ByteArrayOutputStream out = new ByteArrayOutputStream();
ImageIO.write(image, format, out);//将BufferedImage转成out输出流
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
return new ResponseEntity<byte[]>(out.toByteArray(),
headers, HttpStatus.CREATED);
} /**
* 方式三:以流的形式直接显示二维码
* 可设置二维码外观颜色,logo图片
*/
public static void showQrcode(String url, String logPath,HttpServletResponse response, boolean needLog,String format,int width,int height)throws Exception {
BufferedImage image = QRCodeUtil.createImage(url, logPath,needLog,width,height);
boolean bl = ImageIO.write(image, format, response.getOutputStream());
System.out.println(" boolean is " + bl);
} /** 方式四:生成二维码文件存储
* 可设置二维码外观颜色,logo图片
* @param logPath
* @param destPath 存储路径
* @param fileName 存储文件名称(不需要后缀)
* @param needLog
* @param format
* @param width
* @param height
* @return
* @throws Exception
*/
public static boolean SaveQrCode(String url, String logPath,
boolean needLog,String format,int width,int height,String destPath, String fileName) throws Exception { boolean flag = false;
BufferedImage image;
try {
image = QRCodeUtil.createImage(url, logPath,needLog,width,height);
File file = new File(destPath);
// 当文件夹不存在时,mkdirs会自动创建多层目录,区别于mkdir.(mkdir如果父目录不存在则会抛出异常)
if (!file.exists() && !file.isDirectory()) {
file.mkdirs();
}
String fileUrl = fileName + "."+format;
ImageIO.write(image, format, new File(destPath + "/" + fileUrl));
flag = true;
} catch (Exception e) {
e.printStackTrace();
} return flag;
} /**
* 生成二维码图片私有方法
*/
private static BufferedImage createImage (String url, String imgPath,boolean needCompress,
int width, int height) throws Exception {
Hashtable hints = new Hashtable(); // 二维码纠错级别:由高到低 H、Q、M、L
hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
// 二维码边界空白大小由大到小 4、3、2、1(默认为4)
hints.put(EncodeHintType.MARGIN, 1);
BitMatrix bitMatrix = new MultiFormatWriter().encode(url,
BarcodeFormat.QR_CODE, width, height, hints); int H = bitMatrix.getHeight();
int W = bitMatrix.getWidth();
int L = getFinderPatternWidth(bitMatrix) + 3;
int[] pixels = new int[W * H];
// 二维码角颜色,依次为左上、左下、右上
Color redColor = new Color(182, 0, 5);
int redColorInt = redColor.getRGB();
Color greenColor = new Color(0, 124, 54);
int greenColorInt = greenColor.getRGB();
Color blueColor = new Color(0, 64, 152);
int blueColorInt = blueColor.getRGB();
for (int y = 0; y < H; y++) {
for (int x = 0; x < W; x++) {
// 颜色渐变程度,RGB(158,255,158)
int num1 = (int) (158 - (158.0 - 30.0) / bitMatrix.getHeight()
* (y + 1));
int num2 = (int) (255 - (255.0 - 80.0) / bitMatrix.getHeight()
* (y + 1));
int num3 = (int) (158 - (158.0 - 130.0) / bitMatrix.getHeight()
* (y + 1));
Color color = new Color(num1, num2, num3);
int colorInt = color.getRGB();
// 此处可以修改二维码的颜色,可以分别制定二维码和背景的颜色;
pixels[y * W + x] = bitMatrix.get(x, y) ? colorInt : 0xffffff;
}
} BufferedImage image = new BufferedImage(width, height,
BufferedImage.TYPE_INT_RGB); image.getRaster().setDataElements(0, 0, W, H, pixels);
if (imgPath == null || "".equals(imgPath)) {
return image;
}
// 插入图片
QRCodeUtil.insertImage(image, imgPath, needCompress,width,height);
return image; } private static int getFinderPatternWidth(BitMatrix matrix) {
int W = matrix.getWidth();
int H = matrix.getHeight();
int length = 0;
boolean flag = false;
for (int y = 0; y < H; y++) {
for (int x = 0; x < W; x++) {
if (matrix.get(x, y) == true) {
flag = true;
length++;
} else {
if (flag != false) {
return x;
}
}
}
}
return length;
}
/**
* 在二维码中插入图片
*/
private static void insertImage(BufferedImage source, String imgPath,
boolean needCompress,int wid,int hei) throws Exception {
File file = new File(imgPath);
if (!file.exists()) {
System.err.println("" + imgPath + " 该文件不存在!");
return;
}
Image src = ImageIO.read(new File(imgPath));
int width = src.getWidth(null);
int height = src.getHeight(null);
if (needCompress) {
// 压缩LOGO
if (width > wid) {
width = wid;
}
if (height > hei) {
height = hei;
}
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;
}
// 插入LOGO位置
Graphics2D graph = source.createGraphics();
int x = (wid - width) / 2;
int y = (hei - height) / 2;
/*
* int x = QRCODE_SIZE - width - 20; int y = QRCODE_SIZE - height - 20;
*/ graph.drawImage(src, x, y, width, height, null); // logo边框
/*
* Shape shape = new RoundRectangle2D.Float(x, y, width, width, 6, 6);
* graph.setStroke(new BasicStroke(3f)); graph.draw(shape);
*/ graph.dispose();
} controller中调用: package com.example.demo.controller; import com.example.demo.dao.qrcode.QRCodeUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException; /**
* @author jin.tang
* @Title: springbootdemo
* @Package com.example.demo.controller
* @Description: ${todo}
* @date 2017/12/25
*/
@Slf4j
@Controller
public class QRCodeController {
/**
* 获得二维码
* @param request
* @param response
*/
@RequestMapping(value = "phoneversion/getTwoDimension",method={RequestMethod.POST,RequestMethod.GET})
public void getTwoDimensionForIOSs(HttpServletRequest request, HttpServletResponse response){
try {
QRCodeUtil.getTwoDimension("https://bbs.hupu.com/bxj", response, 300, 300);
} catch (IOException e) {
e.printStackTrace();
} } @RequestMapping("/downloadIOSAPPQRCode")
public ResponseEntity<byte[]> downloadIOSAPPController(/*@RequestParam(required = true)String type*/)
throws Exception{
// InputStream is = this.getClass().getClassLoader().getResourceAsStream("app.properties");
// Properties props = new Properties();
// props.load(is);
// String appId = (String)props.get(type);
// String url = "" + appId;
return QRCodeUtil.getResponseEntity("https://www.zhibo8.cc", "F:\\logo.png",true,"png", 300, 300);
} @RequestMapping("/showQrcode")
public void showQrcode(HttpServletRequest request, HttpServletResponse response)
throws Exception{
QRCodeUtil.showQrcode("https://www.zhibo8.cc", "",response,false,"png", 300, 300);
} @RequestMapping("/SaveQrCode")
public void SaveQrCode(HttpServletRequest request, HttpServletResponse response)
throws Exception{
boolean flag=QRCodeUtil.SaveQrCode("https://www.zhibo8.cc", "",false,"png", 300, 300,"D:\\","qrcode");
log.info("flag=="+flag);
}
}
前端显示: <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>首页</title>
</head>
<body>
<p>二维码图片1:</p>
<div><img src="/phoneversion/getTwoDimension" alt="" /></div> <p>二维码图片2:</p>
<img src="/downloadIOSAPPQRCode"/><a href="/downloadIOSAPPQRCode">下载</a> <p>二维码图片3:</p>
<img src="/showQrcode"/><a href="/showQrcode">下载</a>
</body>
</html>}

java web 二维码生成的更多相关文章

  1. java实现二维码生成的几个方法

    1: 使用SwetakeQRCode在Java项目中生成二维码 http://swetake.com/qr/ 下载地址 或着http://sourceforge.jp/projects/qrcode/ ...

  2. Java实现二维码生成的方法

    1.支持QRcode.ZXing 二维码生成.解析: package com.thinkgem.jeesite.test; import com.google.zxing.BarcodeFormat; ...

  3. JAVA实现二维码生成加背景图

    pom.xml依赖 <!-- 二维码生成 -->         <!-- https://mvnrepository.com/artifact/com.google.zxing/c ...

  4. Java条形码/二维码生成和解析

    注意-本类依赖jar包文件:core.jar和zxing-javase.jar 下载jar文件,到本博客文件栏目下载. import com.google.zxing.BarcodeFormat; i ...

  5. Java 条形码 二维码 的生成与解析

    Barcode简介 Barcode是由一组按一定编码规则排列的条,空符号,用以表示一定的字符,数字及符号组成的,一种机器可读的数据表示方式. Barcode的形式多种多样,按照它们的外观分类: Lin ...

  6. 聊聊 Web 项目二维码生成的最佳姿势

    在设计和实现的过程之后,你永远不知道部署上去的程序会已什么样的姿势运行. 本篇借一次生成二维码逻辑的不同实现,阐述 Web 项目中二维码生成的正确姿势. 文中如有批量,欢迎各位看客老爷拍砖.试运行前5 ...

  7. simple go web application & 二维码生成 & 打包部署

    go语言简易web应用 & 二维码生成及解码 & 打包部署 转载请注明出处: https://www.cnblogs.com/funnyzpc/p/10801476.html 前言(闲 ...

  8. java 二维码生成(可带图片)springboot版

    本文(2019年6月29日 飞快的蜗牛博客) 有时候,男人和女人是两个完全不同的世界,男人的玩笑和女人的玩笑也完全是两码事,爱的人完全不了解你,你也不要指望一个女人了解你,所以男的不是要求别人怎么样, ...

  9. atitit.二维码生成总结java zxing

    atitit.二维码生成总结java zxing #-----zxing类库.. but zxing3.0  的类库core-3.0.jar 需要jdk7 只好zing2.2.jar ..jdk6走o ...

随机推荐

  1. Python之禅 this模块

    The Zen of Python, by Tim Peters Beautiful is better than ugly.Explicit is better than implicit.Simp ...

  2. Access denied for user 'ODBC'@'localhost' (using password: NO) 的解决方法

    在部署公司的web项目到myeclipse时遇到的一个错误:Access denied for user 'ODBC'@'localhost' (using password: NO),貌似是mysq ...

  3. Spring Boot注入RestTemplate ,出现空指针解决办法

    SpringBoot 注入RestTemplate 我看了一下大都是让我们在启动类里面加一个Bean配置代码如下 @Autowired private RestTemplateBuilder buil ...

  4. mysql java.sql.SQLException: The server time zone value '?й???????' is unrecognized or represents more than one time zone.

    连接数据库时报错: The server time zone value '?й???????' is unrecognized or represents more than one time zo ...

  5. hearthbuddy中的Class276

    构造函数 需要注意的是this.intptr_0 = this.method_18("mono.dll"); 所以,这个类里面的操作,最后是和mono.dll相关的 interna ...

  6. vuex 讲解

    vuex 状态的管理状态,它采用集中式存储管理应用的所有组件的状态,尤其是在中大型项目,则是很好的开发利器 vuex 的流程图 vuex 的优势: 1. vuex 的存储状态,响应式的 2. 他是所有 ...

  7. linux升级安装openssh时出现依赖冲突

    通过如下方式下载到openssh安装包 https://www.cnblogs.com/qq931399960/p/11120429.html -rwxrwxrwx. root root Jul : ...

  8. leetcode-hard-array-454 4sum II-NO

    mycode   过不了...我也不知道为什么... class Solution(object): def fourSumCount(self, A, B, C, D): ""& ...

  9. [Java]一段尚未雕琢的分词代码

    package com.hy; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStrea ...

  10. python pymysql 连接 mysql数据库进行操作

    1.数据库的连接操作 import pymysql conn = pymysql.connect(host=', db='oldboydb') # host表示ip地址,user表示用户名,passw ...