Android----生成二维码

作者: pgydbh | 来源:发表于2018-08-12 12:55 被阅读3次

    引用了

    ......

    导入包名

        compile 'com.google.zxing:core:3.2.1'
        compile 'cn.bingoogolapple:bga-qrcodecore:1.1.7@aar'
        compile 'cn.bingoogolapple:bga-zxing:1.1.7@aar'
    

    生成二维码

    使用代码
    bitmap = ZXingUtils.createQRImage(getIntent().getStringExtra("content"), 400,  400);
    
    工具类
    /** 
    *   生成条形码和二维码的工具
    */
    public class ZXingUtils {
        /**
         * 生成二维码 要转换的地址或字符串,可以是中文
         * 
         * @param url
         * @param width
         * @param height
         * @return
         */
        public static Bitmap createQRImage(String url, final int width, final int height) {
            try {
                // 判断URL合法性
                if (url == null || "".equals(url) || url.length() < 1) {
                    return null;
                }
                Hashtable<EncodeHintType, String> hints = new Hashtable<EncodeHintType, String>();
                hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
                // 图像数据转换,使用了矩阵转换
                BitMatrix bitMatrix = new QRCodeWriter().encode(url,
                        BarcodeFormat.QR_CODE, width, height, hints);
                int[] pixels = new int[width * height];
                // 下面这里按照二维码的算法,逐个生成二维码的图片,
                // 两个for循环是图片横列扫描的结果
                for (int y = 0; y < height; y++) {
                    for (int x = 0; x < width; x++) {
                        if (bitMatrix.get(x, y)) {
                            pixels[y * width + x] = 0xff000000;
                        } else {
                            pixels[y * width + x] = 0xffffffff;
                        }
                    }
                }
                // 生成二维码图片的格式,使用ARGB_8888
                Bitmap bitmap = Bitmap.createBitmap(width, height,
                        Config.ARGB_8888);
                bitmap.setPixels(pixels, 0, width, 0, 0, width, height);
                return bitmap;
            } catch (WriterException e) {
                e.printStackTrace();
            }
            return null;
        }
    
        /**
         * 生成条形码
         *
         * @param context
         * @param contents
         *            需要生成的内容
         * @param desiredWidth
         *            生成条形码的宽带
         * @param desiredHeight
         *            生成条形码的高度
         * @param displayCode
         *            是否在条形码下方显示内容
         * @return
         */
        public static Bitmap creatBarcode(Context context, String contents,
                                          int desiredWidth, int desiredHeight, boolean displayCode) {
            Bitmap ruseltBitmap = null;
            /**
             * 图片两端所保留的空白的宽度
             */
            int marginW = 20;
            /**
             * 条形码的编码类型
             */
            BarcodeFormat barcodeFormat = BarcodeFormat.CODE_128;
    
            if (displayCode) {
                Bitmap barcodeBitmap = encodeAsBitmap(contents, barcodeFormat,
                        desiredWidth, desiredHeight);
                Bitmap codeBitmap = creatCodeBitmap(contents, desiredWidth + 2
                        * marginW, desiredHeight, context);
                ruseltBitmap = mixtureBitmap(barcodeBitmap, codeBitmap, new PointF(
                        0, desiredHeight));
            } else {
                ruseltBitmap = encodeAsBitmap(contents, barcodeFormat,
                        desiredWidth, desiredHeight);
            }
    
            return ruseltBitmap;
        }
    
        /**
         * 生成条形码的Bitmap
         *
         * @param contents
         *            需要生成的内容
         * @param format
         *            编码格式
         * @param desiredWidth
         * @param desiredHeight
         * @return
         * @throws WriterException
         */
        protected static Bitmap encodeAsBitmap(String contents,
                                               BarcodeFormat format, int desiredWidth, int desiredHeight) {
            final int WHITE = 0xFFFFFFFF;
            final int BLACK = 0xFF000000;
    
            MultiFormatWriter writer = new MultiFormatWriter();
            BitMatrix result = null;
            try {
                result = writer.encode(contents, format, desiredWidth,
                        desiredHeight, null);
            } catch (WriterException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
    
            int width = result.getWidth();
            int height = result.getHeight();
            int[] pixels = new int[width * height];
            // All are 0, or black, by default
            for (int y = 0; y < height; y++) {
                int offset = y * width;
                for (int x = 0; x < width; x++) {
                    pixels[offset + x] = result.get(x, y) ? BLACK : WHITE;
                }
            }
    
            Bitmap bitmap = Bitmap.createBitmap(width, height,
                    Config.ARGB_8888);
            bitmap.setPixels(pixels, 0, width, 0, 0, width, height);
            return bitmap;
        }
    
        /**
         * 生成显示编码的Bitmap
         *
         * @param contents
         * @param width
         * @param height
         * @param context
         * @return
         */
        protected static Bitmap creatCodeBitmap(String contents, int width,
                                                int height, Context context) {
            TextView tv = new TextView(context);
            LayoutParams layoutParams = new LayoutParams(
                    LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
            tv.setLayoutParams(layoutParams);
            tv.setText(contents);
            tv.setHeight(height);
            tv.setGravity(Gravity.CENTER_HORIZONTAL);
            tv.setWidth(width);
            tv.setDrawingCacheEnabled(true);
            tv.setTextColor(Color.BLACK);
            tv.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),
                    MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
            tv.layout(0, 0, tv.getMeasuredWidth(), tv.getMeasuredHeight());
    
            tv.buildDrawingCache();
            Bitmap bitmapCode = tv.getDrawingCache();
            return bitmapCode;
        }
    
        /**
         * 将两个Bitmap合并成一个
         * 
         * @param first
         * @param second
         * @param fromPoint
         *            第二个Bitmap开始绘制的起始位置(相对于第一个Bitmap)
         * @return
         */
        protected static Bitmap mixtureBitmap(Bitmap first, Bitmap second,
                                              PointF fromPoint) {
            if (first == null || second == null || fromPoint == null) {
                return null;
            }
            int marginW = 20;
            Bitmap newBitmap = Bitmap.createBitmap(
                    first.getWidth() + second.getWidth() + marginW,
                    first.getHeight() + second.getHeight(), Config.ARGB_4444);
            Canvas cv = new Canvas(newBitmap);
            cv.drawBitmap(first, marginW, 0, null);
            cv.drawBitmap(second, fromPoint.x, fromPoint.y, null);
            cv.save();
            cv.restore();
    
            return newBitmap;
        }
    
    }
    

    相关文章

      网友评论

        本文标题:Android----生成二维码

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