java使用ZXing生成二维码,以BASE64编码格式页面显示,微信手机端长按图片保存失败问题解决办法

人盡茶涼 提交于 2020-03-11 19:26:09

使用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这个包有问题 

换一个包尝试,编码后结果是在一行了,页面测试二维码图片保存也正常了

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!