2016-03-13 9 views
6

Im new inアンドロイドカメラ2 APi。 すべてのプロジェクトを新しいCamera2 Apiに移動するだけです。私はCamera2Basic exampleを出発点として使用しました。アンドロイドカメラ2ハンドルズーム

イムは、今、この追加することにより、ハンドルズームを試みる:

public boolean onTouchEvent(MotionEvent event) { 
    try { 
     CameraManager manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE); 
     CameraCharacteristics characteristics = manager.getCameraCharacteristics(mCameraId); 
     float maxZoom = (characteristics.get(CameraCharacteristics.SCALER_AVAILABLE_MAX_DIGITAL_ZOOM))*10; 

     Rect m = characteristics.get(CameraCharacteristics.SENSOR_INFO_ACTIVE_ARRAY_SIZE); 
     int action = event.getAction(); 
     float current_finger_spacing; 

     if (event.getPointerCount() > 1) { 
      // Multi touch logic 
      current_finger_spacing = getFingerSpacing(event); 

      if(finger_spacing != 0){ 
       if(current_finger_spacing > finger_spacing && maxZoom > zoom_level){ 
        zoom_level++; 

       } 
       else if (current_finger_spacing < finger_spacing && zoom_level > 1){ 
        zoom_level--; 

       } 
       int minW = (int) (m.width()/maxZoom); 
       int minH = (int) (m.height()/maxZoom); 
       int difW = m.width() - minW; 
       int difH = m.height() - minH; 
       int cropW = difW /100 *(int)zoom_level; 
       int cropH = difH /100 *(int)zoom_level; 
       cropW -= cropW & 3; 
       cropH -= cropH & 3; 
       Rect zoom = new Rect(cropW, cropH, m.width() - cropW, m.height() - cropH); 
       mPreviewRequestBuilder.set(CaptureRequest.SCALER_CROP_REGION, zoom); 
      } 
      finger_spacing = current_finger_spacing; 
     } 
     else{ 
      if (action == MotionEvent.ACTION_UP) { 
       //single touch logic 
      } 
     } 

     try { 
      mCaptureSession.setRepeatingRequest(mPreviewRequestBuilder.build(), mCaptureCallback, 
        null); 
     } 
     catch (CameraAccessException e) { 
      e.printStackTrace(); 
     } 
     catch (NullPointerException ex) 
     { 
      ex.printStackTrace(); 
     } 
    } 
    catch (CameraAccessException e) 
    { 
     throw new RuntimeException("can not access camera.", e); 
    } 

    return true; 
} 

そして、この:

private float getFingerSpacing(MotionEvent event) { 
    float x = event.getX(0) - event.getX(1); 
    float y = event.getY(0) - event.getY(1); 
    return FloatMath.sqrt(x * x + y * y); 
} 

しかし、私は撮影した後に、画像の結果は、ズームなしです。 私はそれを起こすことができます。 ありがとうございます。

更新 captureBuilder.set(CaptureRequest.SCALER_CROP_REGION、zoom);を追加する必要があります。 StillPicture()メソッドをキャプチャします。

+0

あなたはそれを修正しましたか? –

+0

はい、以下のソリューションを追加しました –

+0

captureStillPicture()メソッドは何ですか? – user3819810

答えて

4

追加する必要があります。captureBuilder.set(CaptureRequest.SCALER_CROP_REGION, zoom); キャプチャするには静止画()メソッドを使用します。

2

あなたはSCALER_CROP_REGIONCaptureRequestBuilderに設定しただけで、定期的なプレビューカメラの出力に使用できます。 ImageSaverのJPEG Surfaceを出力として使用するCaptureRequestBuilderに同じクロップリージョンプロパティを追加するだけで済みます。すべて設定する必要があります。

+0

もっと幸せになれますか?どちらの方法でそれが表示されますか? –

+0

@EleElezraキャプチャ時に写真に送信したビルダーでset。(CaptureRequest.SCALER_CROP_REGION)を呼び出す必要があります。ビルダーには、あなたが見ているプレビューと保存される予定の写真に関するすべての情報が含まれています。あなたのビルダーでプレビューと写真の設定パラメータを変更することができます。 詳しい情報はhttp://developer.android.com/intl/es/reference/android/hardware/camera2/CameraCharacteristics.html PDで見ることができます。PD:私はあなたにどのようにしたのか、見てみましょう。 –

0

SCALER.CROP.REGIONcaptureBuilderに設定するだけです。このようにすることができます:

yourCapturebuilder.(CaptureRequest.SCALER_CROP_REGION, newZoom); 

他の方法では、ズームを優先して保持したい場合。 Stringとして優先してのRectを保存し、後でそれを使用するように回復するか、カメラを開き、毎回それを呼び出す:

Preferences.edit().putString(CameraSettings.KEY_ZOOM,newZoom.toString()); 

後にズームを設定するには、このメソッドを呼び出して、私はあなたがこのような何かを示唆しますdinamically:

public boolean setZoomValue(CaptureRequest.Builder builder) { 
     Log.i(TAG,"zoom preference value " + mPreferences.getString(CameraSettings.KEY_ZOOM,null)); 
     String rawZoomValue = mPreferences.getString(CameraSettings.KEY_ZOOM, null); 
     if (rawZoomValue == null) 
      return false; 
     rawZoomValue = rawZoomValue.replaceAll("[Rect() ]", ""); 
     String[] rectZoomList = rawZoomValue.split(",|\\-|\\)|\\("); 
     Rect zoomValue = new Rect(Integer.parseInt(rectZoomList[0]), Integer.parseInt(rectZoomList[1]), Integer.parseInt(rectZoomList[2]),Integer.parseInt(rectZoomList[3])); 
     builder.set(CaptureRequest.SCALER_CROP_REGION, zoomValue); 
     Log.i(TAG, "Zoom applied: " + zoomValue); 
     return true; 

    } 

希望すると助かります!

関連する問題