欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android生成二維碼工具類封裝及使用

 更新時間:2024年04月25日 10:28:48   作者:人民的石頭  
最近公司業(yè)務(wù)上有個生成二維碼圖片的需求(Android端),之后筆者在網(wǎng)上查閱了一些資料,實現(xiàn)了這個功能,這篇文章主要給大家介紹了關(guān)于Android生成二維碼工具類封裝及使用的相關(guān)資料,需要的朋友可以參考下

一、生成二維碼工具類封裝

1、二維碼庫

  // 二維碼
    implementation 'com.journeyapps:zxing-android-embedded:4.3.0'

2、工具類

/**
 * 二維碼
 * 處理工具
 */

public class QRCodeDealUtils {

    /**
     * @param content     字符串內(nèi)容
     * @param size        位圖寬&高(單位:px)
     * @param logo        二維碼logo
     * @param logoPercent 二維碼logo的占比 [0,1]
     * @return
     */
    public static Bitmap createQRCodeBitmapLogo(String content, int size, Bitmap logo, float logoPercent) {
        Bitmap qrCodeBitmap = null;
        Bitmap bitmap;
        try {
            // 不帶logo二維碼
            qrCodeBitmap = generateQRCodeWithoutMargin(content, size, size);
            // 帶logo 二維碼
            bitmap = addLogoToQRCode(qrCodeBitmap, logo, logoPercent);
        } catch (WriterException e) {
            throw new RuntimeException(e);
        }

        return bitmap;
    }


    /**
     * 生成
     * 無白色邊框
     * 二維碼
     */
    public static Bitmap generateQRCodeWithoutMargin(String text, int width, int height) throws WriterException {
        QRCodeWriter qrCodeWriter = new QRCodeWriter();
        Map<EncodeHintType, Object> hints = new HashMap<>();
        hints.put(EncodeHintType.MARGIN, 0); // 設(shè)置邊距為0

        BitMatrix bitMatrix = qrCodeWriter.encode(text, BarcodeFormat.QR_CODE, width, height, hints);
        int[] pixels = new int[width * height];

        for (int y = 0; y < height; y++) {
            for (int x = 0; x < width; x++) {
                if (bitMatrix.get(x, y)) {
                    pixels[y * width + x] = Color.BLACK; // 黑色像素
                } else {
                    pixels[y * width + x] = Color.TRANSPARENT; // 透明像素,去除白邊
                }
            }
        }

        Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
        bitmap.setPixels(pixels, 0, width, 0, 0, width, height);

        return bitmap;
    }

    /**
     * 給二維碼
     * 添加logo
     */
    public static Bitmap addLogoToQRCode(Bitmap srcBitmap, Bitmap logoBitmap, float logoPercent) {
        // 計算Logo相對于二維碼的尺寸
        int logoWidth = Math.round(srcBitmap.getWidth() * logoPercent);
        int logoHeight = Math.round(srcBitmap.getHeight() * logoPercent);

        // 確保Logo尺寸不會超過二維碼尺寸
        if (logoWidth > srcBitmap.getWidth() || logoHeight > srcBitmap.getHeight()) {
            throw new IllegalArgumentException("Logo size is too large for the QR code.");
        }

        // 創(chuàng)建一個新的Bitmap來保存帶Logo的二維碼
        Bitmap resultBitmap = Bitmap.createBitmap(srcBitmap.getWidth(), srcBitmap.getHeight(), srcBitmap.getConfig());
        Canvas canvas = new Canvas(resultBitmap);

        // 繪制原始二維碼
        canvas.drawBitmap(srcBitmap, 0, 0, null);

        // 創(chuàng)建一個Matrix對象來縮放Logo
        Matrix matrix = new Matrix();
        matrix.postScale(logoWidth / (float) logoBitmap.getWidth(),
                logoHeight / (float) logoBitmap.getHeight());

        // 計算Logo應(yīng)該放置的位置(中心)
        int xOffset = (srcBitmap.getWidth() - logoWidth) / 2;
        int yOffset = (srcBitmap.getHeight() - logoHeight) / 2;

        // 在二維碼上繪制Logo
        canvas.drawBitmap(logoBitmap, xOffset, yOffset, null);

        return resultBitmap;
    }


}

二、方法說明

1、不帶logo

   /**
     * 生成
     * 無白色邊框
     * 二維碼
     */
    public static Bitmap generateQRCodeWithoutMargin(String text, int width, int height) throws WriterException {
        QRCodeWriter qrCodeWriter = new QRCodeWriter();
        Map<EncodeHintType, Object> hints = new HashMap<>();
        hints.put(EncodeHintType.MARGIN, 0); // 設(shè)置邊距為0

        BitMatrix bitMatrix = qrCodeWriter.encode(text, BarcodeFormat.QR_CODE, width, height, hints);
        int[] pixels = new int[width * height];

        for (int y = 0; y < height; y++) {
            for (int x = 0; x < width; x++) {
                if (bitMatrix.get(x, y)) {
                    pixels[y * width + x] = Color.BLACK; // 黑色像素
                } else {
                    pixels[y * width + x] = Color.TRANSPARENT; // 透明像素,去除白邊
                }
            }
        }

        Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
        bitmap.setPixels(pixels, 0, width, 0, 0, width, height);

        return bitmap;
    }

2、給二維碼添加logo的方法

   /**
     * 給二維碼
     * 添加logo
     */
    public static Bitmap addLogoToQRCode(Bitmap srcBitmap, Bitmap logoBitmap, float logoPercent) {
        // 計算Logo相對于二維碼的尺寸
        int logoWidth = Math.round(srcBitmap.getWidth() * logoPercent);
        int logoHeight = Math.round(srcBitmap.getHeight() * logoPercent);

        // 確保Logo尺寸不會超過二維碼尺寸
        if (logoWidth > srcBitmap.getWidth() || logoHeight > srcBitmap.getHeight()) {
            throw new IllegalArgumentException("Logo size is too large for the QR code.");
        }

        // 創(chuàng)建一個新的Bitmap來保存帶Logo的二維碼
        Bitmap resultBitmap = Bitmap.createBitmap(srcBitmap.getWidth(), srcBitmap.getHeight(), srcBitmap.getConfig());
        Canvas canvas = new Canvas(resultBitmap);

        // 繪制原始二維碼
        canvas.drawBitmap(srcBitmap, 0, 0, null);

        // 創(chuàng)建一個Matrix對象來縮放Logo
        Matrix matrix = new Matrix();
        matrix.postScale(logoWidth / (float) logoBitmap.getWidth(),
                logoHeight / (float) logoBitmap.getHeight());

        // 計算Logo應(yīng)該放置的位置(中心)
        int xOffset = (srcBitmap.getWidth() - logoWidth) / 2;
        int yOffset = (srcBitmap.getHeight() - logoHeight) / 2;

        // 在二維碼上繪制Logo
        canvas.drawBitmap(logoBitmap, xOffset, yOffset, null);

        return resultBitmap;
    }

3、調(diào)用方式

/**
     * @param content     字符串內(nèi)容
     * @param size        位圖寬&高(單位:px)
     * @param logo        二維碼logo
     * @param logoPercent 二維碼logo的占比 [0,1]
     * @return
     */
    public static Bitmap createQRCodeBitmapLogo(String content, int size, Bitmap logo, float logoPercent) {
        Bitmap qrCodeBitmap = null;
        Bitmap bitmap;
        try {
            // 不帶logo二維碼
            qrCodeBitmap = generateQRCodeWithoutMargin(content, size, size);
            // 帶logo 二維碼
            bitmap = addLogoToQRCode(qrCodeBitmap, logo, logoPercent);
        } catch (WriterException e) {
            throw new RuntimeException(e);
        }

        return bitmap;
    }

總結(jié) 

到此這篇關(guān)于Android生成二維碼工具類封裝及使用的文章就介紹到這了,更多相關(guān)Android生成二維碼內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論