开发者

Android生成二维码工具类封装及使用

目录
  • 一、生成二维码工具类封装
    • 1、二维码库
    • 2、工具类
  • 二、方法说明
    • 1、不带logo
    • 2、给二维码添加logo的方法
    • 3、调用方式
  • 总结 

    一、生成二维码工具类封装

    1、二维码库

      // 二维码
        implementation 'com.journeyapps:zxing-android-embedded:4.3.0'

    2、工具类

    /**
     * 二维码
     * 处理工具
     */
    
    public class QRCodeDealUtils {
    
        /**
         * @param content     字符串内容
         * @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);
            }
    
            returpythonn 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); // 设置边距为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.");
            }
    
            // 创建一个新的Bitmap来保存带Logo的二维码
            Bitmap resultBitmap = Bitmap.createBitmap(srcBitmap.getWidth(), srcBitmap.getHeight(), srcBitmap.getConfig());
            Canvas canvas = new Canvas(resultBitmap);
    
            // 绘制原始二维码
            canvas.drawBitmap(srcBitmap, 0, 0, null);
    
            // 创建一个Matrix对象来缩放Logo
            Matrix matrix = new Matrix();
            matrix.postScale(logoWidth / (float) logoBitmap.getWidth(),
                    logoHeight / (float) logoBitmap.getHeight());
    
            // 计算Logo应该放置的位置(中心)
            int xOffset = (srcBitmap.getWidth()编程客栈 - logoWidth) / 2;
            int yOffset = (srcBitmap.getHeight() - logoHeight) / 2;
    
            // 在二维码上绘制Logo
            canvas.drawBitmap(logoBiwww.devze.comtmap, xOffset, yOffset, null);
    
            return resultBitmap;
        }
    
    
    }
    

    二、方法说明

    1、不带logo

       /**
         * 生成
         * 无白色边框
       php  * 二维码
         */
        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); // 设置边距为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.");
            }
    
            // 创建一个新的Bitmap来保存带Logo的二维码
            Bitmap resultBitmap = Bitmap.createBitmap(srcBitmap.getWidth(), srcBitmap.getHeight(), srcBitmap.getConfig());
            Canvas canvas = new Canvas(resultBitmap);
    
            // 绘制原始二维码
            canvas.drawBitmap(srcBitmap, 0, 0, null);
    
            // 创建一个Matrix对象来缩放Logo
            Matrix matrix = new Matrix();
            matrix.postScale(logoWidth / (float) logoBitmap.getWidth(),
                    logoHeight / (float) logoBitmap.getHeight());
    
            // 计算Logo应该放置的位置(中心)
            int xOffset = (srcBitmap.getWidth() - logoWidth) / 2;
            int yOffset = (srcBitmap.getHeight() - logoHeight) / 2;
    
            // 在二维码上绘制Logo
            canvas.drawBitmap(logoBitmap, xOffset, yOffset, null);
    
            return resultBitmap;
        }

    3、调用方式

    /**
         * @param content     字符串内容
         * @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;
        }

    总结 

    到此这篇关于Android生成二维码工具类封装及使用的文章就介绍到这了,更多相关Android生成二维码内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!

    0

    上一篇:

    下一篇:

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    最新开发

    开发排行榜