您的位置:首页 > 移动开发 > Android开发

二维码工具类

2016-07-28 16:48 465 查看
直接调用即可,是不是很方便~


/**

 * 二维码生成工具类

 */

public class EncodingUtils {

    /**

     * 创建二维码

     *

     * @param content   content

     * @param widthPix  widthPix

     * @param heightPix heightPix

     * @param logoBm    logoBm

     * @return 二维码

     */

    public static Bitmap createQRCode(String content, int widthPix, int heightPix, Bitmap logoBm) {

        try {

            if (content == null || "".equals(content)) {

                return null;

            }

            // 配置参数

            Map<EncodeHintType, Object> hints = new HashMap<EncodeHintType, Object>();

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

            // 容错级别

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

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

            BitMatrix bitMatrix = new QRCodeWriter().encode(content, 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);

            }

            //必须使用compress方法将bitmap保存到文件中再进行读取。直接返回的bitmap是没有任何压缩的,内存消耗巨大!

            return bitmap;

        } catch (WriterException 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;

    }
}

这样使用

// input 是生成二维码中的内容

        String input = "http://www.baidu.com";

        Bitmap bitmap = EncodingUtils.createQRCode(input, 500, 500,

                BitmapFactory.decodeResource(getResources(),

                        R.drawable.ic_launcher));

        iv_two_dimen_code.setImageBitmap(bitmap);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息