美文网首页
zxing需要放远一点才可以扫描出二维码

zxing需要放远一点才可以扫描出二维码

作者: 我是你森哥哥 | 来源:发表于2017-06-09 14:15 被阅读0次

    1. 修改CameraConfigurationManager类下的 void setDesiredCameraParameters(Camera camera) {}方法

    
    Camera.Parameters parameters = camera.getParameters();
        List<Camera.Size> supportedPreviewSizes = parameters.getSupportedPreviewSizes();
        int position =0;
        if(supportedPreviewSizes.size()>2){
          position=supportedPreviewSizes.size()/2+1;//supportedPreviewSizes.get();
        }else {
          position=supportedPreviewSizes.size()/2;
        }
    
        int width = supportedPreviewSizes.get(position).width;
        int height = supportedPreviewSizes.get(position).height;
        Log.d(TAG, "Setting preview size: " + cameraResolution);
        camera.setDisplayOrientation(90);
        cameraResolution.x=width;
        cameraResolution.y=height;
        parameters.setPreviewSize(width,height);
        setFlash(parameters);
        setZoom(parameters);
        camera.setParameters(parameters);
    
    

    2. 生成二维码以及添加logo工具类

    
    /**
         * 生成二维码图片
         *
         * @param content 这三个参数分别表示生成二维码的文本内容(你要把哪一个文本用二维码图片表示出来)
         * @param width   第二个和第三个参数分别表示生成的二维码图片的宽和高
         * @param height
         * @return
         */
        public static Bitmap createQRCodeBitmap(String content, int width, int height) {
            QRCodeWriter qrCodeWriter = new QRCodeWriter();
            Map<EncodeHintType, String> hints = new Hashtable<>();
            hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
            try {
    //            第一个参数表示生成二维码的文本内容,第二个参数表示编码格式,
    // 第三个参数表示生成的二维码的宽度,第四个参数表示生成的二维码的高度,第五个参数可选,可以用来设置文本的编码
                BitMatrix encode = qrCodeWriter.encode(content, BarcodeFormat.QR_CODE, width, height, (Hashtable) hints);
                int[] pixels = new int[width * height];
                for (int i = 0; i < height; i++) {
                    for (int j = 0; j < width; j++) {
                        if (encode.get(j, i)) {
                            pixels[i * width + j] = 0x00000000;
                        } else {
                            pixels[i * width + j] = 0xffffffff;
                        }
                    }
                }
                return Bitmap.createBitmap(pixels, 0, width, width, height, Bitmap.Config.RGB_565);
            } catch (WriterException e) {
                e.printStackTrace();
            }
            return null;
        }
    
        /**
         * 像二维码中添加logo
         *
         * @param qrBitmap   生成的二维码的Bitmap图片
         * @param logoBitmap 第二个参数就是我们的logo图片
         *                   在该方法中我先获取到两张Bitmap各自的宽高,然后创建一个新的空白的Bitmap,这个新的空白的Bitmap的宽高和二维码的宽高一致,
         *                   然后创建一个Canvas对象,创建Canvas对象的时候将blankBitmap传入,这样我一会绘制的东西相当于都是绘制在了blankBitmap上了。
         *                   canvas的drawBitmap方法接收四个参数,第一个是你要绘制的Bitmap对象,第二个和第三个是你要绘制的Bitmap的左上角的坐标,
         *                   第四个参数是一个画笔,一般情况下我们给一个null就可以了,如果你要设置重复模式等等效果的时候可以不给null。
         *                   我们使用drawBitmap方法先将原本的二维码图片绘制出来,绘制完成之后,调用canvas的save方法,将当前的绘制状态保存下来,
         *                   然后对画布进行缩放,缩小画布之后我们来绘制Logo,一帮情况下logo的宽高为二维码原图宽高的1/5(中心logo图片不宜过大
         *                   ,否则会影响到二维码的识别),所以我们先通过一个while循环获得缩放比例,然后调用canvas的scale方法对画布进行缩放,
         *                   前两个参数表示宽高的缩放比例,大于1表示放大,小于1表示缩小,后两个参数表示缩放的中心点。缩放完成之后我们就可以绘制logo了,
         *                   logo绘制完成之后,调用canvas的restore方法将画布恢复为原来的状态,最后将blankBitmap返回
         * @return
         */
        public static Bitmap addLogo2QRCode(Bitmap qrBitmap, Bitmap logoBitmap) {
            int qrBitmapWidth = qrBitmap.getWidth();
            int qrBitmapHeight = qrBitmap.getHeight();
            int logoBitmapWidth = logoBitmap.getWidth();
            int logoBitmapHeight = logoBitmap.getHeight();
            Bitmap blankBitmap = Bitmap.createBitmap(qrBitmapWidth, qrBitmapHeight, Bitmap.Config.ARGB_8888);
            Canvas canvas = new Canvas(blankBitmap);
            canvas.drawBitmap(qrBitmap, 0, 0, null);
            canvas.save(Canvas.ALL_SAVE_FLAG);
            float scaleSize = 1.0f;
            while ((logoBitmapWidth / scaleSize) > (qrBitmapWidth / 5) || (logoBitmapHeight / scaleSize) > (qrBitmapHeight / 5)) {
                scaleSize *= 2;
            }
            float sx = 1.0f / scaleSize;
            canvas.scale(sx, sx, qrBitmapWidth / 2, qrBitmapHeight / 2);
            canvas.drawBitmap(logoBitmap, (qrBitmapWidth - logoBitmapWidth) / 2, (qrBitmapHeight - logoBitmapHeight) / 2, null);
            canvas.restore();
            return blankBitmap;
        }
    
    
    

    3. 二维码的解析

    代码太多不说了

    大神博客:http://blog.csdn.net/u012702547/article/details/51501350

    相关文章

      网友评论

          本文标题:zxing需要放远一点才可以扫描出二维码

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