Android 实现生成二维码

/**

 * 生成二维码,默认大小为500*500

 *

 * @param text 需要生成二维码的文字、网址等

 * @return bitmap

 */

public static Bitmap createQRCode(String text) {

    return createQRCode(text, 150);

}

/**

 * 生成二维码

 *

 * @param text 需要生成二维码的文字、网址等

 * @param size 需要生成二维码的大小()

 * @return bitmap

 */

public static Bitmap createQRCode(String text, int size) {

    try {

        Hashtable<EncodeHintType, Object> hints = new Hashtable<>();

        hints.put(EncodeHintType.CHARACTER_SET, "utf-8");

        hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);

        hints.put(EncodeHintType.MARGIN, 1);

        BitMatrix bitMatrix = new QRCodeWriter().encode(text,

                BarcodeFormat.QR_CODE, size, size, hints);

        int[] pixels = new int[size * size];

        for (int y = 0; y < size; y++) {

            for (int x = 0; x < size; x++) {

                if (bitMatrix.get(x, y)) {

                    pixels[y * size + x] = 0xff000000;

                } else {

                    pixels[y * size + x] = 0xffffffff;

                }

            }

        }

        Bitmap bitmap = Bitmap.createBitmap(size, size,

                Bitmap.Config.ARGB_8888);

        bitmap.setPixels(pixels, 0, size, 0, 0, size, size);

        return bitmap;

    } catch (WriterException e) {

        e.printStackTrace();

        return null;

    }

}

/**

 * 生成带logo的二维码,默认二维码的大小为500,logo为二维码的1/5

 *

 * @param text    需要生成二维码的文字、网址等

 * @param mBitmap logo文件

 * @return bitmap

 */

public static Bitmap createQRCodeWithLogo(String text, Bitmap mBitmap) {

    return createQRCodeWithLogo(text, 500, mBitmap);

}



/**

 * 生成带logo的二维码,logo默认为二维码的1/5

 *

 * @param text    需要生成二维码的文字、网址等

 * @param size    需要生成二维码的大小()

 * @param mBitmap logo文件

 * @return bitmap

 */

public static Bitmap createQRCodeWithLogo(String text, int size, Bitmap mBitmap) {

    try {

        IMAGE_HALFWIDTH = size / 10;

        Hashtable<EncodeHintType, Object> hints = new Hashtable<>();

        hints.put(EncodeHintType.CHARACTER_SET, "utf-8");

        /*

         * 设置容错级别,默认为ErrorCorrectionLevel.L

         * 因为中间加入logo所以建议你把容错级别调至H,否则可能会出现识别不了

         */

        hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);

        //设置空白边距的宽度

        hints.put(EncodeHintType.MARGIN, 1); //default is 4

        // 图像数据转换,使用了矩阵转换

        BitMatrix bitMatrix = new QRCodeWriter().encode(text,

                BarcodeFormat.QR_CODE, size, size, hints);



        int width = bitMatrix.getWidth();//矩阵高度

        int height = bitMatrix.getHeight();//矩阵宽度

        int halfW = width / 2;

        int halfH = height / 2;



        Matrix m = new Matrix();

        float sx = (float) 2 * IMAGE_HALFWIDTH / mBitmap.getWidth();

        float sy = (float) 2 * IMAGE_HALFWIDTH

                / mBitmap.getHeight();

        m.setScale(sx, sy);

        //设置缩放信息

        //将logo图片按martix设置的信息缩放

        mBitmap = Bitmap.createBitmap(mBitmap, 0, 0,

                mBitmap.getWidth(), mBitmap.getHeight(), m, false);



        int[] pixels = new int[size * size];

        for (int y = 0; y < size; y++) {

            for (int x = 0; x < size; x++) {

                if (x > halfW - IMAGE_HALFWIDTH && x < halfW + IMAGE_HALFWIDTH

                        && y > halfH - IMAGE_HALFWIDTH

                        && y < halfH + IMAGE_HALFWIDTH) {

                    //该位置用于存放图片信息

                    //记录图片每个像素信息

                    pixels[y * width + x] = mBitmap.getPixel(x - halfW

                            + IMAGE_HALFWIDTH, y - halfH + IMAGE_HALFWIDTH);

                } else {

                    if (bitMatrix.get(x, y)) {

                        pixels[y * size + x] = 0xff000000;

                    } else {

                        pixels[y * size + x] = 0xffffffff;

                    }

                }

            }

        }

        Bitmap bitmap = Bitmap.createBitmap(size, size,

                Bitmap.Config.ARGB_8888);

        bitmap.setPixels(pixels, 0, size, 0, 0, size, size);

        return bitmap;

    } catch (WriterException e) {

        e.printStackTrace();

        return null;

    }

}





/**

 * 生成二维码Bitmap  此方法与上面的createQRCodeWithLogo方法效果一样(设置Bitmap两种写方法)

 *

 * @param context

 * @param data     文本内容

 * @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, 1); //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) {
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值