zxing二维码拉伸问题
来源:互联网 发布:淘宝卖家怎么增加粉丝 编辑:程序博客网 时间:2024/05/01 07:36
google提供的zxing二维码识别demo在有些机型上拉伸非常严重,可以通过设置SurfaceView全屏,并设置图片宽高比,预览宽高比与屏幕宽高比一致来解决,具体代码如下
只修改了CameraConfigurationManager中 getCameraResolution(Camera.Parameters parameters, Point screenResolution)方法和 setDesiredCameraParameters(Camera camera)
/* * Copyright (C) 2010 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */package com.yagou.yggx.android.qrcode;import android.content.Context;import android.graphics.Point;import android.hardware.Camera;import android.hardware.Camera.Size;import android.os.Build;import android.util.Log;import android.view.Display;import android.view.WindowManager;import java.lang.reflect.Method;import java.util.Collections;import java.util.Comparator;import java.util.List;import java.util.regex.Pattern;import com.baidu.platform.comapi.map.s;import com.yagou.yggx.android.utils.Toast;final class CameraConfigurationManager { private static final String TAG = CameraConfigurationManager.class.getSimpleName(); private static final int TEN_DESIRED_ZOOM = 27; private static final int DESIRED_SHARPNESS = 30; private static final Pattern COMMA_PATTERN = Pattern.compile(","); private final Context context; private Point screenResolution; private Point cameraResolution; private int previewFormat; private String previewFormatString; CameraConfigurationManager(Context context) { this.context = context; } /** * Reads, one time, values from the camera that are needed by the app. */ void initFromCameraParameters(Camera camera) { Camera.Parameters parameters = camera.getParameters(); previewFormat = parameters.getPreviewFormat(); previewFormatString = parameters.get("preview-format"); Log.d(TAG, "Default preview format: " + previewFormat + '/' + previewFormatString); WindowManager manager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); Display display = manager.getDefaultDisplay(); screenResolution = new Point(display.getWidth(), display.getHeight()); Log.d(TAG, "Screen resolution: " + screenResolution); cameraResolution = getCameraResolution(parameters, screenResolution); Log.d(TAG, "Camera resolution: " + screenResolution); } /** * Sets the camera up to take preview images which are used for both preview and decoding. * We detect the preview format here so that buildLuminanceSource() can build an appropriate * LuminanceSource subclass. In the future we may want to force YUV420SP as it's the smallest, * and the planar Y can be used for barcode scanning without a copy in some cases. */ void setDesiredCameraParameters(Camera camera) { Camera.Parameters parameters = camera.getParameters(); Log.d(TAG, "Setting preview size: " + cameraResolution); parameters.setPreviewSize(cameraResolution.x, cameraResolution.y); setFlash(parameters); setZoom(parameters); //setSharpness(parameters); //modify here // camera.setDisplayOrientation(90); //����2.1 setDisplayOrientation(camera, 90); camera.setParameters(parameters); Size pic=getPicSize(parameters.getSupportedPictureSizes(),1.0*cameraResolution.x/cameraResolution.y); parameters.setPictureSize(pic.width, pic.height); pic=parameters.getPictureSize(); Size pre=parameters.getPreviewSize(); Toast.showText(context, "pic "+pic.width+" "+pic.height+"\n pre "+pre.width+" "+pre.height, 1); } private Size getPicSize(List<Size> list, double d) {// TODO Auto-generated method stub Collections.sort(list, new Comparator<Size>() {@Overridepublic int compare(Size lhs, Size rhs) {// TODO Auto-generated method stubif (lhs.width-rhs.width==0) {return lhs.height-rhs.height;}return lhs.width-rhs.width;}}); for (Size size : list) {if (Math.abs(size.width*1.0/size.height-d)<0.03) {return size;}}return list.get(0);}Point getCameraResolution() { return cameraResolution; } Point getScreenResolution() { return screenResolution; } int getPreviewFormat() { return previewFormat; } String getPreviewFormatString() { return previewFormatString; } private static Point getCameraResolution(Camera.Parameters parameters, Point screenResolution) { System.out.println("pingmu "+screenResolution.x+" "+screenResolution.y); List<Size>list= parameters.getSupportedPreviewSizes(); Collections.sort(list, new Comparator<Size>() { @Overridepublic int compare(Size lhs, Size rhs) {// TODO Auto-generated method stubif (lhs.width-rhs.width==0) {return lhs.height-rhs.height;}return lhs.width-rhs.width;}}); for (Size size : list) { System.out.println(size.width+" "+size.height);if (Math.abs( size.width*1.0/size.height - 1.0*screenResolution.y/screenResolution.x )<0.1) {return new Point(size.width, size.height);} } return new Point(list.get(0).width, list.get(0).height); // String previewSizeValueString = parameters.get("preview-size-values");// // saw this on Xperia// if (previewSizeValueString == null) {// previewSizeValueString = parameters.get("preview-size-value");// }//// Point cameraResolution = null;//// if (previewSizeValueString != null) {// Log.d(TAG, "preview-size-values parameter: " + previewSizeValueString);// cameraResolution = findBestPreviewSizeValue(previewSizeValueString, screenResolution);// }//// if (cameraResolution == null) {// // Ensure that the camera resolution is a multiple of 8, as the screen may not be.// cameraResolution = new Point(// (screenResolution.x >> 3) << 3,// (screenResolution.y >> 3) << 3);// }//// return cameraResolution; } private static Point findBestPreviewSizeValue(CharSequence previewSizeValueString, Point screenResolution) { int bestX = 0; int bestY = 0; int diff = Integer.MAX_VALUE; 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); if (newDiff == 0) { bestX = newX; bestY = newY; break; } else if (newDiff < diff) { bestX = newX; bestY = newY; diff = newDiff; } } if (bestX > 0 && bestY > 0) { return new Point(bestX, bestY); } return null; } private static int findBestMotZoomValue(CharSequence stringValues, int tenDesiredZoom) { int tenBestValue = 0; for (String stringValue : COMMA_PATTERN.split(stringValues)) { stringValue = stringValue.trim(); double value; try { value = Double.parseDouble(stringValue); } catch (NumberFormatException nfe) { return tenDesiredZoom; } int tenValue = (int) (10.0 * value); if (Math.abs(tenDesiredZoom - value) < Math.abs(tenDesiredZoom - tenBestValue)) { tenBestValue = tenValue; } } return tenBestValue; } private void setFlash(Camera.Parameters parameters) { // FIXME: This is a hack to turn the flash off on the Samsung Galaxy. // And this is a hack-hack to work around a different value on the Behold II // Restrict Behold II check to Cupcake, per Samsung's advice //if (Build.MODEL.contains("Behold II") && // CameraManager.SDK_INT == Build.VERSION_CODES.CUPCAKE) { if (Build.MODEL.contains("Behold II") && CameraManager.SDK_INT == 3) { // 3 = Cupcake parameters.set("flash-value", 1); } else { parameters.set("flash-value", 2); } // This is the standard setting to turn the flash off that all devices should honor. parameters.set("flash-mode", "off"); } private void setZoom(Camera.Parameters parameters) { String zoomSupportedString = parameters.get("zoom-supported"); if (zoomSupportedString != null && !Boolean.parseBoolean(zoomSupportedString)) { return; } int tenDesiredZoom = TEN_DESIRED_ZOOM; String maxZoomString = parameters.get("max-zoom"); if (maxZoomString != null) { try { int tenMaxZoom = (int) (10.0 * Double.parseDouble(maxZoomString)); if (tenDesiredZoom > tenMaxZoom) { tenDesiredZoom = tenMaxZoom; } } catch (NumberFormatException nfe) { Log.w(TAG, "Bad max-zoom: " + maxZoomString); } } String takingPictureZoomMaxString = parameters.get("taking-picture-zoom-max"); if (takingPictureZoomMaxString != null) { try { int tenMaxZoom = Integer.parseInt(takingPictureZoomMaxString); if (tenDesiredZoom > tenMaxZoom) { tenDesiredZoom = tenMaxZoom; } } catch (NumberFormatException nfe) { Log.w(TAG, "Bad taking-picture-zoom-max: " + takingPictureZoomMaxString); } } String motZoomValuesString = parameters.get("mot-zoom-values"); if (motZoomValuesString != null) { tenDesiredZoom = findBestMotZoomValue(motZoomValuesString, tenDesiredZoom); } String motZoomStepString = parameters.get("mot-zoom-step"); if (motZoomStepString != null) { try { double motZoomStep = Double.parseDouble(motZoomStepString.trim()); int tenZoomStep = (int) (10.0 * motZoomStep); if (tenZoomStep > 1) { tenDesiredZoom -= tenDesiredZoom % tenZoomStep; } } catch (NumberFormatException nfe) { // continue } } // Set zoom. This helps encourage the user to pull back. // Some devices like the Behold have a zoom parameter if (maxZoomString != null || motZoomValuesString != null) { parameters.set("zoom", String.valueOf(tenDesiredZoom / 10.0)); } // Most devices, like the Hero, appear to expose this zoom parameter. // It takes on values like "27" which appears to mean 2.7x zoom if (takingPictureZoomMaxString != null) { parameters.set("taking-picture-zoom", tenDesiredZoom); } }public static int getDesiredSharpness() {return DESIRED_SHARPNESS;}/** * compatible 1.6 * @param camera * @param angle */protected void setDisplayOrientation(Camera camera, int angle){ Method downPolymorphic; try { downPolymorphic = camera.getClass().getMethod("setDisplayOrientation", new Class[] { int.class }); if (downPolymorphic != null) downPolymorphic.invoke(camera, new Object[] { angle }); } catch (Exception e1) { } } }
0 0
- zxing二维码拉伸问题
- ZXing 二维码Surface拉伸问题处理
- 关于 zxing二维码竖屏的拉伸问题
- ZXing二维码扫描横屏变竖屏,并解决摄像拉伸问题
- 使用Zxing扫描到的二维码拉伸问题
- Zxing图片纵向拉伸问题 Android 二维码扫描
- Zxing图片拉伸解决 Android 二维码扫描
- Zxing图片拉伸解决 Android 二维码扫描
- zxing 二维码扫描 解决竖屏状态下 被拉伸的问题
- 解决Android二维码扫描ZXing竖屏拉伸变长闪退扫描区域小等问题
- Android二维码扫描使用ZXing竖屏拉伸变长闪退扫描区域小等问题
- 解决Android二维码扫描ZXing竖屏拉伸变长闪退问题
- 使用google Zxing 二维码 竖屏拉伸问题解决方法
- android中zxing二维码图片拉伸的解决
- Android Zxing二维码扫描图片拉伸、扫描框过小、扫描框扩大后(或不拉伸后)闪退问题
- zxing 扫描二维码变形问题
- 关于zxing二维码扫描开灯的问题
- 关于Zxing二维码开发的问题
- 刚开的博客测试下
- 黑马程序员_IO流之字节流
- 匿名项目连载(二)--->登录流程
- Android实现RecyclerView侧滑删除和长按拖拽-ItemTouchHelper
- caffe 学c++ 编程 技巧
- zxing二维码拉伸问题
- selenium IDE下载地址
- 特征点匹配方法(SIFT匹配)的一点见解
- 如何在多站点情况服务器下查看对应的站点的日志遇到相关知识
- Android项目利用jinkens自动打包
- python学习问题总结
- 缓存淘汰算法系列之2——LFU类
- Android的硬件抽象层模块编写规范
- 解决Windows下genymotion unable to load virtual engine问题