美文网首页
Zxing在Android端实现二维码的扫描和生成

Zxing在Android端实现二维码的扫描和生成

作者: Small_Cake | 来源:发表于2020-01-14 12:12 被阅读0次

zxing

  • 1.引入:直接首页我并没有找到通过Gradle的引入方式,但我们仔细看wiki,不难发现引入对应地址即可

最新的引入,要求API24+

    //zxing二维码生成扫描
    implementation 'com.google.zxing:core:3.4.0'
    implementation 'com.journeyapps:zxing-android-embedded:4.0.0'

降级的引入,要求API14+

    //zxing二维码生成扫描
    implementation 'com.google.zxing:core:3.3.3'
    implementation 'com.journeyapps:zxing-android-embedded:3.6.0'

其中zxing-android-embedded是基于zxing的用于Android的条形码扫描库,使用ZXing进行解码。

  • 2.使用:写个工具类

import android.graphics.Bitmap;
import android.graphics.Matrix;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import com.journeyapps.barcodescanner.BarcodeEncoder;

import java.util.HashMap;
import java.util.Hashtable;

public class ZxingUtils {
    private static int IMAGE_HALFWIDTH = 50;//宽度值,影响中间图片大小
    private static BarcodeEncoder barcodeEncoder;
    static { barcodeEncoder = new BarcodeEncoder(); }
    /**
     * 生成二维码,默认500大小
     * @param contents 需要生成二维码的文字、网址等
     * @return bitmap
     */
    public static Bitmap createQRCode(String contents) {
        try {
            return barcodeEncoder.encodeBitmap(contents, BarcodeFormat.QR_CODE, 500, 500);
        } catch (WriterException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 生成二维码
     * @param contents 需要生成二维码的文字、网址等
     * @param size 需要生成二维码的大小()
     * @return bitmap
     */
    public static Bitmap createQRCode(String contents, int size) {
        try {
            return barcodeEncoder.encodeBitmap(contents, BarcodeFormat.QR_CODE, size, size);
        } catch (WriterException e) {
            e.printStackTrace();
        }
        return null;
    }


    /**
     * 生成二维码
     * @param contents 需要生成二维码的文字、网址等
     * @param size 需要生成二维码的大小()
     * @param whiteBorderScale 白边宽度比例,最低1,也就是二维码图片的1%白边
     * @return bitmap
     */
    public static Bitmap createQRCode(String contents, int size,int whiteBorderScale ) {
        try {
            HashMap<EncodeHintType, Object> hints = new HashMap<>();
            hints.put(EncodeHintType.MARGIN, whiteBorderScale<0?1:whiteBorderScale);
            return barcodeEncoder.encodeBitmap(contents,BarcodeFormat.QR_CODE, size, size, hints);
        } catch (WriterException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 有logo的二维码
     * @param contents
     * @param size
     * @param logo
     * @return
     */
    public static Bitmap createQRCode(String contents, int size,Bitmap logo) {
        return createQRCodeWithLogo(contents,size,logo,1);
    }
    public static Bitmap createQRCode(String contents, int size,Bitmap logo,int whiteBorderScale) {
        return createQRCodeWithLogo(contents,size,logo,whiteBorderScale);
    }

    /**
     * 生成带logo的二维码,logo默认为二维码的1/5
     *
     * @param contents 需要生成二维码的文字、网址等
     * @param size 需要生成二维码的大小()
     * @param logo logo文件
     * @return bitmap
     */
    private static Bitmap createQRCodeWithLogo(String contents, int size, Bitmap logo,int whiteBorderScale) {
        try {
            IMAGE_HALFWIDTH = size/10;
            Hashtable<EncodeHintType, Object> hints = new Hashtable<>();
            hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
            /*
             * 设置容错级别,默认为ErrorCorrectionLevel.L
             * 因为中间加入logo所以建议你把容错级别调至H,否则可能会出现识别不了
             */
            hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
            hints.put(EncodeHintType.MARGIN,whiteBorderScale<0?1:whiteBorderScale);
            BitMatrix bitMatrix = new QRCodeWriter().encode(contents, BarcodeFormat.QR_CODE, size, size, hints);
            int width = bitMatrix.getWidth();//矩阵高度
            int height = bitMatrix.getHeight();//矩阵宽度
            int halfW = width / 2;
            int halfH = height / 2;

            Matrix m = new Matrix();
            float sx = (float) 2 * IMAGE_HALFWIDTH / logo.getWidth();
            float sy = (float) 2 * IMAGE_HALFWIDTH / logo.getHeight();
            m.setScale(sx, sy);
            //设置缩放信息
            //将logo图片按martix设置的信息缩放
            logo = Bitmap.createBitmap(logo, 0, 0, logo.getWidth(), logo.getHeight(), m, false);

            int[] pixels = new int[size * size];
            for (int y = 0; y < size; y++) {
                for (int x = 0; x < size; x++) {
                    if (x > halfW - IMAGE_HALFWIDTH && x < halfW + IMAGE_HALFWIDTH
                            && y > halfH - IMAGE_HALFWIDTH
                            && y < halfH + IMAGE_HALFWIDTH) {
                        //该位置用于存放图片信息
                        //记录图片每个像素信息
                        pixels[y * width + x] = logo.getPixel(x - halfW
                                + IMAGE_HALFWIDTH, y - halfH + IMAGE_HALFWIDTH);
                    } else {
                        if (bitMatrix.get(x, y)) {
                            pixels[y * size + x] = 0xff000000;
                        } else {
                            pixels[y * size + x] = 0xffffffff;
                        }
                    }
                }
            }
            Bitmap bitmap = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888);
            bitmap.setPixels(pixels, 0, size, 0, 0, size, size);
            return bitmap;
        } catch (WriterException e) {
            e.printStackTrace();
            return null;
        }
    }
}

  • 3.使用,生成bitmap
Bitmap qrCode = ZxingUtils.createQRCode("你好,我的世界!");
imageView.setImageBitmap(qrCode);
image.png

相关文章

网友评论

      本文标题:Zxing在Android端实现二维码的扫描和生成

      本文链接:https://www.haomeiwen.com/subject/oynoactx.html