包:链接:https://pan.baidu.com/s/1MampoA6ZQa9nhjBt-N9v2A
提取码:o2fm
base64在浏览器中显示:
<img src=“http://www.letuknowit.com/images/wg.png”/>
也可以这样显示:
<img src=“data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAkCAYAAABIdFAMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAHhJREFUeNo8zjsOxCAMBFB/KEAUFFR0Cbng3nQPw68ArZdAlOZppPFIBhH5EAB8b+Tlt9MYQ6i1BuqFaq1CKSVcxZ2Acs6406KUgpt5/LCKuVgz5BDCSb13ZO99ZOdcZGvt4mJjzMVKqcha68iIePB86GAiOv8CDADlIUQBs7MD3wAAAABJRU5ErkJggg%3D%3D”/>
package com.utils.jointImg;
/**
* Copyright:
* FileName: QRCodeMax
* Author:
* Date: 2019/4/30 13:50
* Description: 生成二维码跟背景图拼接
* History:
*/
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import sun.misc.BASE64Encoder;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Map;
/**
* 类名称:QRCodeMax
* 类描述:生成二维码图片+背景+文字描述工具类
* 修改备注:更新有参数构造
* @version: 2.0
*
*/
public class QRCodeMax {
//文字显示
private static final int QRCOLOR = 0x201f1f; // 二维码颜色:黑色
private static final int BGWHITE = 0xFFFFFF; //二维码背景颜色:白色
// 设置QR二维码参数信息
private static Map<EncodeHintType, Object> hints = new HashMap<EncodeHintType, Object>() {
private static final long serialVersionUID = 1L;
{
put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);// 设置QR二维码的纠错级别(H为最高级别)
put(EncodeHintType.CHARACTER_SET, "utf-8");// 设置编码方式
put(EncodeHintType.MARGIN, 0);// 白边
}
};
/**
* 生成二维码图片+背景+文字描述
* @param codeFile 生成图地址
* @param bgImgFile 背景图地址
* @param WIDTH 二维码宽度
* @param HEIGHT 二维码高度
* @param qrUrl 二维码识别地址
* @param note 文字描述1
* @param tui 文字描述2
* @param size 文字大小
* @param imagesX 二维码x轴方向
* @param imagesY 二维码y轴方向
* @param text1X 文字描述1x轴方向
* @param text1Y 文字描述1y轴方向
* @param text2X 文字描述2x轴方向
* @param text2Y 文字描述2y轴方向
*/
public static String CreatQRCode(File codeFile, File bgImgFile, Integer WIDTH, Integer HEIGHT, String qrUrl,
String note, String tui, Integer size, Integer imagesX, Integer imagesY, Integer text1X, Integer text1Y
, Integer text2X, Integer text2Y) {
String binary = null;
Hashtable hints = new Hashtable();
hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
try {
MultiFormatWriter multiFormatWriter = new MultiFormatWriter();
// 参数顺序分别为: 编码内容,编码类型,生成图片宽度,生成图片高度,设置参数
BitMatrix bm = multiFormatWriter.encode(qrUrl, BarcodeFormat.QR_CODE, WIDTH, HEIGHT, hints);
// BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
BufferedImage image = toBufferedImage(bm);
ByteArrayOutputStream out = new ByteArrayOutputStream();
// 开始利用二维码数据创建Bitmap图片,分别设为黑(0xFFFFFFFF) 白(0xFF000000)两色
for (int x = 0; x < WIDTH; x++) {
for (int y = 0; y < HEIGHT; y++) {
image.setRGB(x, y, bm.get(x, y) ? QRCOLOR : BGWHITE);
}
}
/*
* 添加背景图片
*/
BufferedImage backgroundImage = ImageIO.read(bgImgFile);
int bgWidth=backgroundImage.getWidth();
int qrWidth=image.getWidth();
//距离背景图片x边的距离,居中显示
int disx=(bgWidth-qrWidth)-imagesX;
//距离y边距离 * * * *
int disy=imagesY;
Graphics2D rng=backgroundImage.createGraphics();
rng.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP));
rng.drawImage(image,disx,disy,WIDTH,HEIGHT,null);
/*
* 文字描述参数设置
*/
Color textColor=Color.white;
rng.setColor(textColor);
rng.drawImage(backgroundImage,0,0,null);
//设置字体类型和大小(BOLD加粗/ PLAIN平常)
rng.setFont(new Font("微软雅黑,Arial",Font.BOLD,size));
//设置字体颜色
rng.setColor(Color.black);
int strWidth=rng.getFontMetrics().stringWidth(note);
//文字1显示位置
int disx1=(bgWidth-strWidth)-text1X;//左右
rng.drawString(note,disx1,text1Y);//上下
//文字2显示位置
int disx2=(bgWidth-strWidth)-text2X;//左右
rng.drawString(tui,disx2,text2Y);//上下
rng.dispose();
image=backgroundImage;
image.flush();
InputStream is =null;
//ImageIO.write(image, "png", codeFile);
//写入、格式、写出
ImageIO.write(image, "png", out);
byte[] bytes = out.toByteArray();
// 将字节数组转为二进制
BASE64Encoder encoder = new BASE64Encoder();
binary = encoder.encodeBuffer(bytes).trim();
} catch (Exception e) {
e.printStackTrace();
}
return binary;
}
/**
* 测试
* @param args
*/
public static void main(String[] args) {
File bgImgFile=new File("E:/code.png");//背景图片
File QrCodeFile = new File("E:/index.png");//生成图片位置
String url = "https://www.baidu.com";//二维码链接
String note = "" ;//文字描述
String tui = "" ;//文字描述
//宣传二维码生成
//生成图地址,背景图地址,二维码宽度,二维码高度,二维码识别地址,文字描述1,文字描述2,文字大小,图片x轴方向,图片y轴方向,文字1||2xy轴方向
CreatQRCode(QrCodeFile,bgImgFile, 180, 180, url, note,tui, 38, 339, 961, 0, 0, 410, 210);
//System.out.println( CreatQRCode(QrCodeFile,bgImgFile, 180, 180, url, note,tui, 38, 339, 961, 0, 0, 410, 210));
}
/* public static String creatRrCode(String contents, int width, int height) {
String binary = null;
Hashtable hints = new Hashtable();
hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
try {
BitMatrix bitMatrix = new MultiFormatWriter().encode(
contents, BarcodeFormat.QR_CODE, width, height, hints);
// 1、读取文件转换为字节数组
ByteArrayOutputStream out = new ByteArrayOutputStream();
BufferedImage image = toBufferedImage(bitMatrix);
//转换成png格式的IO流
ImageIO.write(image, "png", out);
byte[] bytes = out.toByteArray();
// 2、将字节数组转为二进制
BASE64Encoder encoder = new BASE64Encoder();
binary = encoder.encodeBuffer(bytes).trim();
} catch (WriterException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return binary;
}*/
/**
* image流数据处理
*
* @author ianly
*/
public static BufferedImage toBufferedImage(BitMatrix matrix) {
int width = matrix.getWidth();
int height = matrix.getHeight();
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
for (int x = 0; x < width; x++) {
for (int y = 0; y < height; y++) {
image.setRGB(x, y, matrix.get(x, y) ? 0xFF000000 : 0xFFFFFFFF);
}
}
return image;
}
}
另一种生成二维码的方式:
package com.utils.jointImg;
import com.swetake.util.Qrcode;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.UnsupportedEncodingException;
/**
* Copyright:2019,
* FileName: tojoinImg
* Author: lixionghao
* Date: 2019/4/30 10:35
* Description: 图片二维码拼接
* History:
*/
public class tojoinImg {
/**
* @param content 二维码存储的内容
* @param imgType 生成二维码的数据格式
* @param size
* @return
*/
private BufferedImage qRCodeCommon(String content, String imgType, int size) {
Qrcode qrcode = new Qrcode();
qrcode.setQrcodeErrorCorrect('M');// 纠错级别(L 7%、M 15%、Q 25%、H 30%)和版本有关qrcode.setQrcodeEncodeMode('B');
qrcode.setQrcodeVersion(7);// 设置Qrcode包的版本
BufferedImage bi = null;
try {
byte[] d = content.getBytes("GBK");
bi = new BufferedImage(139, 139, BufferedImage.TYPE_INT_RGB);
Graphics2D g = bi.createGraphics();
g.setBackground(Color.WHITE);// 设置背景颜色(白色)
g.clearRect(0, 0, 139, 139); // 矩形 X、Y、width、height
g.setColor(Color.BLACK); // 设置图像颜色(黑色)
if (d.length > 0 && d.length < 123) {
boolean[][] b = qrcode.calQrcode(d);
for (int i = 0; i < b.length; i++) {
for (int j = 0; j < b.length; j++) {
if (b[j][i]) {
g.fillRect(j * 3 + 2, i * 3 + 2, 3, 3);
}
}
}
}
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} // 字符集
return bi;
}
public static void main(String[] args) {
/* String content = "我要生成的内容";
tojoinImg img = new tojoinImg();
try{
BufferedImage bufImg = img.qRCodeCommon(content, "png", 14);
//指定要生成的图片路径
File file = new File("E:/a.jpg");
// 生成二维码QRCode图片
ImageIO.write(bufImg, "jpg", file);
} catch(Exception e){
e.printStackTrace();
}*/
/* try {
*//*Student stu = new Student("test", 11);
stu.setId(10);*//*
getQrocodeImg("http://baidu.com", "E:/timg.jpg","F:/timg.jpg");
} catch (Exception e) {
e.printStackTrace();
}*/
}
/**
* 生成二维码工具类
* 二维码生成核心方法
* @param content 二维码存储的内容
* @param imgPath 二维码图片路径
* @param logoPath 中间logo的图片路径
* @throws Exception 异常
*/
public static void getQrocodeImg(String content,String imgPath,String logoPath)
throws Exception{
//实例化qecode对象
Qrcode qrcode = new Qrcode();
//设置排错率15%空间 错误信息
qrcode.setQrcodeErrorCorrect('M');
//二维码存储内容的编码集
qrcode.setQrcodeEncodeMode('B');
//设置二维码的版本 1-40 值越大尺寸越大,可存储的信息越大
qrcode.setQrcodeVersion(15);
//准备绘制二维码 画画条件:画板 画笔
int width = 235; //宽
int height = 235; //高
//创建画板
BufferedImage image = new BufferedImage(width, height,
BufferedImage.TYPE_INT_RGB);
//绘制工具
Graphics2D gs =image.createGraphics();
//设置背景颜色
gs.setBackground(Color.white);
//开始绘制矩形
gs.clearRect(0, 0, width, height);
//设置前景色
gs.setColor(Color.black);
//接受内容
// byte[] codeOut = objectToByte(content);
byte[] codeOut;
codeOut = content.getBytes("utf-8");
//通过byte数组获取boolean 类型二维码
boolean[][] code = qrcode.calQrcode(codeOut);
//遍历这个二维数组
for (int i = 0; i < code.length; i++) {
for (int j = 0; j < code.length; j++) {
//如果是真的就涂黑
if (code[i][j]) {
gs.fillRect(j*3+2, i*3+2, 3, 3);
}
}
}
//加入中间logo
/*Image img= ImageIO.read(new File(logoPath));*/
//80,80是距离gs两个边的距离,55,55是中间logo的大小
//gs.drawImage(img,80,80,75,75,null);
//释放资源
image.flush();
gs.dispose();
image.flush();
//写入指定路径
ImageIO.write(image, "png", new File(imgPath));
System.out.println("二维码生成成功!");
}
}
包:链接:https://pan.baidu.com/s/1T-vJJ70UOuNJHAjj8DYBzA
提取码:r0aq