android 使用zxing生成中间嵌套logo的二维码

本文介绍了一种在Android平台上生成带有Logo的二维码的方法,并提供了详细的代码实现。通过调整参数,可以自定义二维码的尺寸、容错级别等属性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

效果图:


zxing请自行下载

代码:

/**
     * 生成二维码Bitmap
     *
     * @param content   文本内容
     * @param logoBm    二维码中心的Logo图标(可以为null)
     * @return 合成后的bitmap
     */ 
    public static Bitmap createQRImage(Context context,String data, Bitmap logoBm) { 
       
    	try { 
    		
            if (data == null || "".equals(data)) { 
                return null; 
            } 
            
            int widthPix = ((Activity) context).getWindowManager().getDefaultDisplay()
					.getWidth();
            widthPix = widthPix / 5 * 3;
            int heightPix = widthPix;
   
            //配置参数 
            Map<EncodeHintType, Object> hints = new HashMap<EncodeHintType, Object>(); 
            hints.put(EncodeHintType.CHARACTER_SET, "utf-8"); 
            //容错级别 
            hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H); 
            //设置空白边距的宽度 
            hints.put(EncodeHintType.MARGIN, 3); //default is 4 
   
            // 图像数据转换,使用了矩阵转换 
            BitMatrix bitMatrix = new QRCodeWriter().encode(data, BarcodeFormat.QR_CODE, widthPix, heightPix, hints); 
            int[] pixels = new int[widthPix * heightPix]; 
            // 下面这里按照二维码的算法,逐个生成二维码的图片, 
            // 两个for循环是图片横列扫描的结果 
            for (int y = 0; y < heightPix; y++) { 
                for (int x = 0; x < widthPix; x++) { 
                    if (bitMatrix.get(x, y)) { 
                        pixels[y * widthPix + x] = 0xff000000; 
                    } else { 
                        pixels[y * widthPix + x] = 0xffffffff; 
                    } 
                } 
            } 
   
            // 生成二维码图片的格式,使用ARGB_8888 
            Bitmap bitmap = Bitmap.createBitmap(widthPix, heightPix, Bitmap.Config.ARGB_8888); 
            bitmap.setPixels(pixels, 0, widthPix, 0, 0, widthPix, heightPix); 
   
            if (logoBm != null) { 
                bitmap = addLogo(bitmap, logoBm); 
            } 
   
            return bitmap;
            //必须使用compress方法将bitmap保存到文件中再进行读取。直接返回的bitmap是没有任何压缩的,内存消耗巨大! 
            //return bitmap != null && bitmap.compress(Bitmap.CompressFormat.JPEG, 100, new FileOutputStream(filePath)); 
        } catch (Exception e) { 
            e.printStackTrace(); 
        } 
   
        return null; 
    } 
   
    /**
     * 在二维码中间添加Logo图案
     */ 
    private static Bitmap addLogo(Bitmap src, Bitmap logo) { 
        if (src == null) { 
            return null; 
        } 
   
        if (logo == null) { 
            return src; 
        } 
   
        //获取图片的宽高 
        int srcWidth = src.getWidth(); 
        int srcHeight = src.getHeight(); 
        int logoWidth = logo.getWidth(); 
        int logoHeight = logo.getHeight(); 
   
        if (srcWidth == 0 || srcHeight == 0) { 
            return null; 
        } 
   
        if (logoWidth == 0 || logoHeight == 0) { 
            return src; 
        } 
   
        //logo大小为二维码整体大小的1/5 
        float scaleFactor = srcWidth * 1.0f / 5 / logoWidth; 
        Bitmap bitmap = Bitmap.createBitmap(srcWidth, srcHeight, Bitmap.Config.ARGB_8888); 
        try { 
            Canvas canvas = new Canvas(bitmap); 
            canvas.drawBitmap(src, 0, 0, null); 
            canvas.scale(scaleFactor, scaleFactor, srcWidth / 2, srcHeight / 2); 
            canvas.drawBitmap(logo, (srcWidth - logoWidth) / 2, (srcHeight - logoHeight) / 2, null); 
   
            canvas.save(Canvas.ALL_SAVE_FLAG); 
            canvas.restore(); 
        } catch (Exception e) { 
            bitmap = null; 
            e.getStackTrace(); 
        } 
   
        return bitmap; 
    } 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值