android程序中Zxing二维码扫描图片变形 问题解决方法

本文介绍如何在ZXing相机配置管理器中选择最佳预览图片尺寸,确保预览图片不会变形。通过调整代码逻辑,找到与屏幕分辨率比例最匹配的预览尺寸。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考:http://www.360doc.com/content/14/0825/15/16319846_404515413.shtml   。


每部手机中设置了好几组预览图片的尺寸、以及实际图片的尺寸。只有当预览图的尺寸比例和实际图片的比例相同的时候就不会出现变形的情况。

对于ZXing扫描来说,实际图片的大小就是屏幕的大小,所以我们要从好几组预览图片的尺寸中找到一组比例(主要是宽、高比例)最合适的,这样预览的图片就不会变形了。

打开文件:
*.*.*.zxing.camera.CameraConfigurationManager.java找到以下片段:

private static Point findBestPreviewSizeValue(CharSequence previewSizeValueString, Point screenResolution) {
    int bestX = 0;
    int bestY = 0;
    float diff = Float.MAX_VALUE;
    Log.d(TAG, "screen point: "+screenResolution);
    for (String previewSize : COMMA_PATTERN.split(previewSizeValueString)) {
      previewSize = previewSize.trim();
      int dimPosition = previewSize.indexOf('x');
      if (dimPosition < 0) {
        Log.w(TAG, "Bad preview-size: " + previewSize);
        continue;
      }

      int newX;
      int newY;
      try {
        newX = Integer.parseInt(previewSize.substring(0, dimPosition));
        newY = Integer.parseInt(previewSize.substring(dimPosition + 1));
      } catch (NumberFormatException nfe) {
        Log.w(TAG, "Bad preview-size: " + previewSize);
        continue;
      }
     
      //这一段是原来的代码
     // int newDiff = Math.abs(newX - screenResolution.x) + Math.abs(newY - screenResolution.y);
      //以下是修改后的代码
      float newDiff = Math.abs(screenResolution.x * 1.0f / newY - screenResolution.y * 1.0f / newX);
      if (newDiff == 0) {
        bestX = newX;
        bestY = newY;
        break;
      } else if (newDiff < diff) {
        bestX = newX;
        bestY = newY;
        diff = newDiff;
      }
      Log.w(TAG, "preview-size: " + previewSize +", newDiff: "+newDiff+", diff: "+diff);
    }

    if (bestX > 0 && bestY > 0) {
      return new Point(bestX, bestY);
    }
   
    return null;
  }



以下是调试的输出信息:

02-25 16:20:22.599    5725-5725/**** D/CameraConfigurationManager﹕ Screen resolution: Point(720, 1280)
02-25 16:20:22.599    5725-5725**** D/CameraConfigurationManager﹕ preview-size-values parameter: 1920x1080,1280x960,1280x720,960x720,960x540,864x480,800x480,768x432,720x540,720x480,640x480,576x432,480x320,384x288,352x288,320x240,240x160,176x144,144x176
02-25 16:20:22.599    5725-5725/**** D/CameraConfigurationManager﹕ Camera resolution: Point(720, 1280)
02-25 16:20:22.609    5725-5725/**** D/CameraConfigurationManager﹕ Setting preview size: Point(1920, 1080)

可以看到支持的预览参数有很多个,这时屏幕的宽、高分别是:720、1280,那么最后寻找的最佳预览是1920,1080,感觉不太对了,哈哈,因为这时屏幕是竖屏的,所以我当时的屏幕是1280、720,那适配的就对了,1920、1080分别就是1280和720的1.5倍,比例适配正好。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值