美文网首页工具类
去除zixing生成二维码的白边

去除zixing生成二维码的白边

作者: lipyhui | 来源:发表于2019-08-13 10:34 被阅读0次

    一、说明

      笔记主要是记录一些本人在开发当中的学习和使用笔记。笔记内容包含一些本人觉得重要的知识点、本人易犯的错误等。
      由于本人水平有限,其中出现的错误或者不合理的地方望各位读者多多包含,并指出其中不合理和错误的地方,以便我来修改正。谢谢!

    二、笔记时间

      2019年08月13日

    三、简述

      本文主要记录如何去除zixing生成的二维码白边。

    四、详情

      最近在一个项目中需要给二维码添加文字说明,当我加上文字说明后,发现二维码有白边,和理想显示效果完全不协调。
      经过了解zixing生成二维码的时候会自动根据设置的宽高、内容复杂度,算出一个最佳的二维码宽高,并非我们自己设置的宽高。这样问题就出现了,zixing算出的宽高比我们自己设置的宽高要小,因此zixing的白边就出现了。
      那么怎么才能去掉zixing的白边?本人尝试了很多方法。包括zixing自带的白边宽度参数,当我想当然的设置为0的时候发现并没有任何效果。最后选择根据生成的二维码重新创建一个真实宽高的二维码,用此来达到去白边的目的。

    1、创建真实宽高的二维码矩阵

       /**
         * 删除白边
         *
         * @param matrix
         * @return
         */
        private static BitMatrix deleteWhite(BitMatrix matrix) {
            int[] rec = matrix.getEnclosingRectangle();
            int resWidth = rec[2] + 1;
            int resHeight = rec[3] + 1;
    
            BitMatrix resMatrix = new BitMatrix(resWidth, resHeight);
            resMatrix.clear();
            for (int i = 0; i < resWidth; i++) {
                for (int j = 0; j < resHeight; j++) {
                    if (matrix.get(i + rec[0], j + rec[1]))
                        resMatrix.set(i, j);
                }
            }
            return resMatrix;
        }
    

    2、生成二维码bitmap图片

    /**
         * 生成二维码Bitmap
         *
         * @param content   内容
         * @param widthPix  图片宽度
         * @param heightPix 图片高度
         */
        public static Bitmap createQRImage(String content, int widthPix, int heightPix) {
            try {
                if (content == null || "".equals(content)) {
                    return null;
                }
    
                //配置参数
                Map<EncodeHintType, Object> hints = new HashMap();
                hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
                //容错级别
                hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
                //设置空白边距的宽度
                hints.put(EncodeHintType.MARGIN, 1); //default is 4
    
                // 图像数据转换,使用了矩阵转换
                BitMatrix bitMatrix = new QRCodeWriter().encode(content, BarcodeFormat.QR_CODE, widthPix, heightPix, hints);
                bitMatrix = deleteWhite(bitMatrix);//删除白边
    
                widthPix = bitMatrix.getWidth();
                heightPix = bitMatrix.getHeight();
                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);
    
                return bitmap;
            } catch (WriterException e) {
                e.printStackTrace();
            }
            return null;
        }
    

    相关文章

      网友评论

        本文标题:去除zixing生成二维码的白边

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