使用Google的Zxing包来完成生成二维码图片。
1.maven工程依赖如下
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>core</artifactId>
<version>3.3.0</version>
</dependency>
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>javase</artifactId>
<version>3.3.0</version>
</dependency>
Zxing版本选择说明:网上查阅资料显示Zxing3.3.0需要jdk1.7支持,更高版本可能需要1.8。
由于我的项目不是maven的,所以我在另外一个maven项目中引入依赖、打包项目、取出jar包如下
core-3.3.0.jar
jai-imageio-core-1.3.1.jar
javase-3.3.0.jar
jcommander-1.48.jar
2.代码部分
因为不想保存图片,所以使用Zxing直接处理为字节数组,然后处理为BASE64编码字符串,交给页面img标签显示。(使用data:image/png;base64)
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import org.apache.commons.codec.binary.Base64;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.WriterException;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;
public class ZxingTest {
public static byte[] getQRCodeImage(String text, int width, int height) throws WriterException, IOException {
QRCodeWriter qrCodeWriter = new QRCodeWriter();
BitMatrix bitMatrix = qrCodeWriter.encode(text, BarcodeFormat.QR_CODE, width, height);
ByteArrayOutputStream pngOutputStream = new ByteArrayOutputStream();
MatrixToImageWriter.writeToStream(bitMatrix, "PNG", pngOutputStream);
byte[] pngData = pngOutputStream.toByteArray();
return pngData;
}
public static void main(String[] args) {
try {
byte[] sInput = getQRCodeImage("https://www.baidu.com", 350, 350);
// BASE64Encoder encoder = new BASE64Encoder();
// String base64Img = encoder.encode(sInput);
String base64Img = new String(Base64.encodeBase64(sInput));
System.out.println(base64Img);
String qr = "data:image/png;base64,"+base64Img;
} catch (WriterException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
String qr = "data:image/png;base64,"+base64Img;
request.setAttribute("qr", qr);
<body>
<img alt="" src="${qr }">
</body>
页面成功显示二维码,在微信app中长按图片正常识别。
3.问题
长按二维码图片保存,发现微信提示保存失败,页面在手机自带浏览器中保存图片正常,微信在其他页面保存别的图片正常,判断是生成的二维码有问题。
网上查阅资料说可能是因为BASE64编码处理后不是一行。
怀疑是import sun.misc.BASE64Encoder这个包有问题
换一个包尝试,编码后结果是在一行了,页面测试二维码图片保存也正常了
来源:oschina
链接:https://my.oschina.net/u/4205853/blog/3191934