【java】二维码的生成和使用
2016-03-02 09:47
471 查看
maven 依赖:
使用google的zxing包
<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>
工具类代码:
package com.kaiyuan.kp.kyshop.app.twoDimensionCode;
import java.awt.BasicStroke;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.file.Path;
import java.util.HashMap;
import java.util.Map;
import javax.imageio.ImageIO;
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;
/**
*
*二维码生成工具类(ZXing)
*/
public class TwoDimensionCodeUtil {
/**
* 生成二维码(ZXing)图片 ,编码默认UTF-8
* @param content 二维码内容
* @param path 文件存储路径,不包括文件名称
* @param fileName 文件名称,不加后缀
* @param imageType 图片类型
* @param width 宽度
* @param height 高度
*/
public static void encoderTwoDimensionCodeToFile(String content,String path,String fileName,String imageType,int width,int height){
MultiFormatWriter multiFormatWriter = new MultiFormatWriter();
Map<EncodeHintType,String> hints = new HashMap<EncodeHintType,String>();
hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
try {
BitMatrix bitMatrix = multiFormatWriter.encode(content, BarcodeFormat.QR_CODE, width, height,hints);
Path filepath = new File(path+fileName+"."+imageType).toPath();
MatrixToImageWriter.writeToPath(bitMatrix, imageType, filepath);
} catch (Exception e){
e.printStackTrace();
}
}
/**
* 将二维码输出到流,编码默认UTF-8
* @param content 二维码内容
* @param imageType 图片类型
* @param width 宽度
* @param height 高度
* @param out 输出流
*/
public static void encoderTwoDimensionCodeToStream(String content,String imageType,int width,int height,OutputStream out){
MultiFormatWriter multiFormatWriter = new MultiFormatWriter();
Map<EncodeHintType,String> hints = new HashMap<EncodeHintType,String>();
hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
try {
BitMatrix bitMatrix = multiFormatWriter.encode(content, BarcodeFormat.QR_CODE, width, height,hints);
MatrixToImageWriter.writeToStream(bitMatrix, imageType, out);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 生成带logo的二维码图片流
* @param content
* @param imageType
* @param width
* @param height
* @param out
*/
public static void encoderLogoTwoDimensionCodeToStream(String content,String imageType,int width,int height,OutputStream out){
MultiFormatWriter multiFormatWriter = new MultiFormatWriter();
Map<EncodeHintType,String> hints = new HashMap<EncodeHintType,String>();
hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
ByteArrayOutputStream o1 =new ByteArrayOutputStream();
try {
BitMatrix bitMatrix = multiFormatWriter.encode(content, BarcodeFormat.QR_CODE, width, height,hints);
MatrixToImageWriter.writeToStream(bitMatrix, imageType, o1);
} catch (Exception e) {
e.printStackTrace();
}
ByteArrayInputStream in = new ByteArrayInputStream(o1.toByteArray());
encoderLogoTwoDimensionCodeToStream( in, new File("d:/logo.jpg"), imageType, new LogoConfig(), out);
}
public static void encoderLogoTwoDimensionCodeToStream(InputStream in, File logoPic,String imageType, LogoConfig logoConfig,OutputStream out)
{
try
{
/**
* 读取二维码图片,并构建绘图对象
*/
BufferedImage image = ImageIO.read(in);
Graphics2D g = image.createGraphics();
/**
* 读取Logo图片
*/
BufferedImage logo = ImageIO.read(logoPic);
int widthLogo = logo.getWidth(), heightLogo = logo.getHeight();
// 计算图片放置位置
int x = (image.getWidth() - widthLogo) / 2;
int y = (image.getHeight() - logo.getHeight()) / 2;
//开始绘制图片
g.drawImage(logo, x, y, widthLogo, heightLogo, null);
g.drawRoundRect(x, y, widthLogo, heightLogo, 15, 15);
g.setStroke(new BasicStroke(logoConfig.getBorder()));
g.setColor(logoConfig.getBorderColor());
g.drawRect(x, y, widthLogo, heightLogo);
g.dispose();
ImageIO.write(image, imageType, out);
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
使用方式:
String content = httpRequest.getParameter("content"); //二维码映射的实际Url
String imageType = httpRequest.getParameter("imageType"); //图片类型
int width = Integer.parseInt(httpRequest.getParameter("width")); //二维码宽
int height = Integer.parseInt(httpRequest.getParameter("height")); //二维码高
if (Strings.isNullOrEmpty(content)) {
LOGGER.warn("The content is null or empty");
return (T) new Result(StatusCodes.BAD_REQUEST, false);
}
httpResponse.setContentType("image/jpg");
try {
TwoDimensionCodeUtil.encoderTwoDimensionCodeToStream(content, imageType, width, height,
httpResponse.getOutputStream());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
页面使用返回的流:
a295
html:
<img id="Img" src="" />
js:
var src = encodeURI("/twoDimensionCode/erweima?content=www.baidu.com&imageType=jpg&width=25&height=25");
$("#Img").attr("src",src);
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树