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

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


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

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

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

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. private static Point findBestPreviewSizeValue(CharSequence previewSizeValueString, Point screenResolution) {  
  2.     int bestX = 0;  
  3.     int bestY = 0;  
  4.     float diff = Float.MAX_VALUE;  
  5.     Log.d(TAG, "screen point: "+screenResolution);  
  6.     for (String previewSize : COMMA_PATTERN.split(previewSizeValueString)) {  
  7.       previewSize = previewSize.trim();  
  8.       int dimPosition = previewSize.indexOf('x');  
  9.       if (dimPosition < 0) {  
  10.         Log.w(TAG, "Bad preview-size: " + previewSize);  
  11.         continue;  
  12.       }  
  13.   
  14.       int newX;  
  15.       int newY;  
  16.       try {  
  17.         newX = Integer.parseInt(previewSize.substring(0, dimPosition));  
  18.         newY = Integer.parseInt(previewSize.substring(dimPosition + 1));  
  19.       } catch (NumberFormatException nfe) {  
  20.         Log.w(TAG, "Bad preview-size: " + previewSize);  
  21.         continue;  
  22.       }  
  23.        
  24.       //这一段是原来的代码  
  25.      // int newDiff = Math.abs(newX - screenResolution.x) + Math.abs(newY - screenResolution.y);  
  26.       //以下是修改后的代码  
  27.       float newDiff = Math.abs(screenResolution.x * 1.0f / newY - screenResolution.y * 1.0f / newX);  
  28.       if (newDiff == 0) {  
  29.         bestX = newX;  
  30.         bestY = newY;  
  31.         break;  
  32.       } else if (newDiff < diff) {  
  33.         bestX = newX;  
  34.         bestY = newY;  
  35.         diff = newDiff;  
  36.       }  
  37.       Log.w(TAG, "preview-size: " + previewSize +", newDiff: "+newDiff+", diff: "+diff);  
  38.     }  
  39.   
  40.     if (bestX > 0 && bestY > 0) {  
  41.       return new Point(bestX, bestY);  
  42.     }  
  43.      
  44.     return null;  
  45.   }  



以下是调试的输出信息:

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倍,比例适配正好。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值