Zxing在Android端實現(xiàn)二維碼的掃描和生成

zxing

  • 1.引入:直接首頁我并沒有找到通過Gradle的引入方式,但我們仔細看wiki,不難發(fā)現(xiàn)引入對應地址即可

最新的引入,要求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;
    }

    /**
     * 有l(wèi)ogo的二維碼
     * @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,否則可能會出現(xiàn)識別不了
             */
            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
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容