ZXing改橫屏識別爲豎屏識別-中間極光線,並解決圖像拉伸問題

      好久沒上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 包。

當然加入這句話不錯的哥們 就不用管啦, 唉, 爲了後人不走彎路,特別奉上。


 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章