美文网首页工具类
去除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