2016-03-13 27 views
6

Android camera2'de yeni bir modelim APi. Tüm projemi yeni Camera2 Api'ye taşıyorum. Camera2Basic example'u başlangıç ​​potası olarak kullandım.android camera2 tanıtıcı zum

Im şimdi bu ekleyerek kolu zoom çalışırken:

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; 
} 

Ve bu:

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); 
} 

Ama yakalanan sonra, resim sonucu zoom yoktur. Bunu nasıl mutlu edebilirim. Hepinize teşekkürler.

Güncelleme captureBuilder.set (CaptureRequest.SCALER_CROP_REGION, zum) eklemek gerekiyor; StillPicture() yöntemini yakalamak için.

+0

bunu düzelttiniz mi? –

+0

Evet, çözümümün altında –

+0

eklendi: captureStillPicture() yöntemi nedir ??? – user3819810

cevap

4

captureBuilder.set(CaptureRequest.SCALER_CROP_REGION, zoom); Eklenmesi gerekenler captureStillPicture() yöntemine.

2

SCALER_CROP_REGION'u, yinelenen önizleme kamerası çıkışı için CaptureRequestBuilder'da ayarladınız. Sadece ImageSaver'un JPEG Surface'unu kullanan CaptureRequestBuilder ürününe aynı ürün bölgesi özelliğini eklemeniz yeterlidir ve her şey ayarlanmış olmalıdır.

+0

Daha spesifik olabilir misiniz lütfen? Hangi yöntemde görüntülenecek? –

+0

@EliElezra, yakaladığınızda fotoğrafa gönderdiğiniz oluşturucuda (CaptureRequest.SCALER_CROP_REGION) kümeyi aramanız gerekir. Oluşturucu, izlediğiniz önizleme hakkındaki tüm bilgileri ve kaydedilecek fotoğrafı içerir. Oluşturucunuzdaki önizleme ve fotoğraf ayarları parametrelerini değiştirebilirsiniz. Daha fazla bilgiyi şu adresten bulabilirsiniz: http://developer.android.com/intl/es/reference/android/hardware/camera2/CameraCharacteristics.html PD: Nasıl yaptığımı aşağıdan bir gönderiyorum, Bir göz at. –

0

'u captureBuilder'a ayarlayın. Bu şekilde yapabilirsiniz:

yourCapturebuilder.(CaptureRequest.SCALER_CROP_REGION, newZoom); 

başka bir şekilde, bir tercih Zum tutmak istiyorsanız. Bir String olarak tercih Rect kaydedin ve daha sonra kullanmak için onu kurtarmak veya kamerayı açar her diyoruz:

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

Daha sonra zoom ayarlamak için bu yöntemi çağırın ben böyle bir şey yapmanızı öneririm İsteğe bağlı olarak:

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; 

    } 

Size yardımcı olacaktır umarım!

İlgili konular