您的位置:首页 > 其它

ZXing改横屏识别为竖屏识别-中间极光线,并解决图像拉伸问题

2012-12-04 10:05 465 查看
      好久没上csdn了, 在这里特别想念大家, 最近公司一段时间忙吧,无暇东顾。扫噶,还是直接进入主题吧

     大家都知道 直接从google down下来的 zxing二维码扫描 是 在扫描界面 中间的红线是 竖着的 ,那么怎么能让它 横着 显示呢, 只 因简单几步,轻松搞定

     首先讲下关键的几个类  

     CaptureActivity。这个是启动Activity 也就是扫描器(如果是第一安装,它还会跳转到帮助界面)。

     CaptureActivityHandler 解码处理类,负责调用另外的线程进行解码。

     DecodeThread 解码的线程。

     com.google.zxing.client.android.camera 包,摄像头控制包。

     ViewfinderView 自定义的View,就是我们看见的拍摄时中间的框框了

      一 点开 com.google.zxing.client.android包下在DecodeHandler.java中,修改decode方法 在decode 方法中 修改 代码

PlanarYUVLuminanceSource source = CameraManager.get().buildLuminanceSource(data, width, height); 把这行注释 在下方修改为:这里还是为了初学者考虑这样写

/**

     * 在此修改

     */

    byte[] rotatedData = new byte[data.length];

    for (int y = 0; y < height; y++) {

        for (int x = 0; x < width; x++)

            rotatedData[x * height + height - y - 1] = data[x + y * width];

    }

    int tmp = width; // Here we are swapping, that's the difference to #11

    width = height;

    height = tmp;

   

   PlanarYUVLuminanceSource source = CameraManager.get().buildLuminanceSource(rotatedData, width, height);

    /**

     * 修改结束

     */

 二  点开包com.google.zxing.client.android.camera 下 CameraManager 中 getFramingRectInPreview() 方法中 修改

//      rect.left = rect.left * cameraResolution.x / screenResolution.x;

//      rect.right = rect.right * cameraResolution.x / screenResolution.x;

//      rect.top = rect.top * cameraResolution.y / screenResolution.y;

//      rect.bottom = rect.bottom * cameraResolution.y / screenResolution.y;  // 修改前这四行 注释

      /**

       * 修改后

       */

      rect.left = rect.left * cameraResolution.y / screenResolution.x;

      rect.right = rect.right * cameraResolution.y / screenResolution.x;

      rect.top = rect.top * cameraResolution.x / screenResolution.y;

      rect.bottom = rect.bottom * cameraResolution.x / screenResolution.y;

三  顺便在 还在这个包中的 CameraConfigurationManager 类中的setDesiredCameraParameters方法中添加一句

 第一、 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);

    camera.setParameters(parameters);

    //camera.setDisplayOrientation(90);// 框框中改横线是 修改的 , 这行代码就可以注释了, 就不用了, 如果用这行代码 则会出现 极光线变成横线的时候 图像有拉伸的功能了

// 使摄像头旋转90度
   setDisplayOrientation(camera, 90);

  }

添加  setDisplayOrientation(camera, 90);这个方法.

/*改变照相机成像的方向的方法*/
 protected void setDisplayOrientation(Camera camera, int angle) {
     Method downPolymorphic = null;        
     try {
       downPolymorphic = camera.getClass().getMethod("setDisplayOrientation", new Class[] { int.class });
       if (downPolymorphic != null)     
             downPolymorphic.invoke(camera, new Object[]{angle});        
   } catch (NoSuchMethodException e) {
       e.printStackTrace();
   } catch (IllegalArgumentException e) {
       e.printStackTrace();
   } catch (IllegalAccessException e) {
       e.printStackTrace();
   } catch (InvocationTargetException e) {
       e.printStackTrace();
   }

 }

 第二、

    在 这个类中 的这个方法 void initFromCameraParameters(Camera camera) { 里面 在 

Log.d(TAG, "Screen resolution: " + screenResolution); 

下面添加如下代码  

 //为竖屏添加
   Point screenResolutionForCamera = new Point();
   screenResolutionForCamera.x = screenResolution.x;
   screenResolutionForCamera.y = screenResolution.y;
   if (screenResolution.x < screenResolution.y) {
       screenResolutionForCamera.x = screenResolution.y;
       screenResolutionForCamera.y = screenResolution.x;
   }
   // 下句第二参数要根据竖屏修改
   cameraResolution = getCameraResolution(parameters, screenResolutionForCamera);

/*cameraResolution = getCameraResolution(parameters, screenResolution);*/ 并注释zxing自带的 这行代码

四 ,在AndroidManifest.xml中,把CaptureActivity的属性android:screenOrientation="landscape"

改为

  android:screenOrientation="portrait"

 

够详细了吧, 开发 二维码扫描的哥们 在搞不出来, 实在不知道说什么好了 。

但是在修改中存在一个问题, 若是 在上述第三个步骤中 加入   camera.setDisplayOrientation(90); 这句话报错时, 给zxing换一个核心包,若是还报错直接换个搞点版本的Android包就OK 了, 建议直接换成 高点的Android 包。

当然加入这句话不错的哥们 就不用管啦, 唉, 为了后人不走弯路,特别奉上。

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: