生成彩色二维码

效果图

在这里插入图片描述
导入依赖包链接: https://pan.baidu.com/s/1Xh08yttbd4btOvHj6fZRZg 提取码: ifis
下载之后解压,然后将文件Import module进项目

/**
* 二维码生成工具类
*/
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,int fontColor,int backColor) {
       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);
           // 图像数据转换,使用了矩阵转换
           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 (x < 1.1*widthPix / 3 && y < 1.1*heightPix / 3||x < widthPix / 2.8 && y > 1.9*heightPix / 3||x > 1.9*widthPix / 3 && y < 1.1*heightPix / 3) {
                       if (bitMatrix.get(x, y)) {
                           pixels[y * widthPix + x] =fontColor;
                       } else {
                           pixels[y * widthPix + x] = Color.WHITE;
                       }
                   }else  {
                       if (bitMatrix.get(x, y)) {
                           pixels[y * widthPix + x] = backColor;// 绿色
                       } else {
                           pixels[y * widthPix + x] = Color.WHITE;
                       }
                   }
               }
           }
           // 生成二维码图片的格式,使用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;
   }


   public static Bitmap addBackground(Bitmap foreground,Bitmap background){
       int fgWidth = foreground.getWidth();
       int fgHeight = foreground.getHeight();
       int bgWidth=background.getWidth();
       int bgHeight=background.getHeight();
       Bitmap newmap = Bitmap
               .createBitmap(fgWidth, fgHeight, Bitmap.Config.ARGB_8888);
       Canvas canvas = new Canvas(newmap);
       canvas.drawBitmap(background, 0, 0, null);
       canvas.drawBitmap(foreground, 0, 0, null);
       canvas.save();
       canvas.restore();
       return newmap;
   }


   /**
    * 在二维码中间添加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.restore();
       } catch (Exception e) {
           bitmap = null;
           e.getStackTrace();
       }
       return bitmap;
   }
}

这是将libzxing源码做修改,多传入了两个参数控制颜色,以下是调用

EncodingUtils.createQRCode(etContent, 500, 500, bitmapFormResources, frontColor, backColor);

bitmapFormResources是二维码中间小图标,类型为bitmap,frontColor是前景色,backColor后景色
颜色为16进制颜色  如白色为OXFFFFFFFF,黑色为0XFF000000

这个本地包里写入了闪光灯的开关

  //开闪光灯
    private void openLight() {
        camera = CameraManager.getCamera();//我们先前在CameraManager类中添加的静态方法  
        params = camera.getParameters();
        params.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
        camera.setParameters(params);
        camera.startPreview();
        ivFlashLight.setImageResource(R.mipmap.flash_close);
        isOpen = true;
    }
    //关闪光灯 
    private void closeLight(){
        params.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
        camera.setParameters(params);
        ivFlashLight.setImageResource(R.drawable.flish_light_scan);
        isOpen = false;
    }

打开相册选取二维码

//打开相册
    private void open_picture(){
        Intent innerIntent = new Intent(Intent.ACTION_GET_CONTENT);
        innerIntent.setType("image/*");
        Intent wrapperIntent = Intent.createChooser(innerIntent, "请选择二维码图片");
        CaptureActivity.this.startActivityForResult(wrapperIntent, REQUEST_CODE_SCAN_GALLERY);
    }
需要动态申请权限 ActivityCompat.requestPermissions(CaptureActivity.this
                      , new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},1);



在MyAsyncTask 里做了扫描结果回调处理
                  Intent resultIntent = new Intent();
                     resultIntent.putExtra("result",result);
                    captureActivity.setResult(0033, resultIntent);
                    captureActivity.finish();
result是扫描结果


猜你喜欢

转载自blog.csdn.net/qq_39252578/article/details/89026605