2016-03-13 51 views
6

Jestem nowy w Aparacie z Androidem2. Po prostu przenosimy cały projekt do nowego Api Camera2. Użyłem Camera2Basic example jako punktu początkowego.Aparat fotograficzny z Androidem 2 uchwyt zoom

Im próbuje teraz uchwyt zoom, dodając w ten sposób:

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

a to:

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

Ale po niewoli, wynik jest obraz bez powiększenia. Jak mogę to zrobić? Dzięki wszystkim.

Aktualizacja Trzeba dodać captureBuilder.set (CaptureRequest.SCALER_CROP_REGION, zoom); Aby przechwycić metodęStillPicture().

+0

naprawiłeś to? –

+0

Tak, dodano moje rozwiązanie poniżej –

+0

co to jest metoda captureStillPicture() ??? – user3819810

Odpowiedz

4

Konieczność dodania captureBuilder.set(CaptureRequest.SCALER_CROP_REGION, zoom);Aby przechwycić metodęStillPicture().

2

Ustawiono tylko SCALER_CROP_REGION na CaptureRequestBuilder na powtarzające się wyjście kamery podglądu. Trzeba tylko dodać tę samą właściwość regionu przycinania do CaptureRequestBuilder, która używa jako obrazu wyjściowego ImageSaver JPEG Surface i wszystko powinno być ustawione.

+0

Czy możesz być bardziej spesific proszę? W jakiej metodzie będzie pokazywany? –

+0

@EliElezra musisz wywołać zestaw. (CaptureRequest.SCALER_CROP_REGION) w budowniczym, który wysłałeś do zdjęcia po jego zrobieniu. Konstruktor zawiera wszystkie informacje na temat podglądu, który oglądasz, oraz zdjęcie, które będzie zapisywane. Możesz modyfikować parametry podglądu i ustawień zdjęć w swoim programie budującym. Więcej informacji można znaleźć na stronie: http://developer.android.com/intl/es/reference/android/hardware/camera2/CameraCharacteristics.html PD: Podaję poniżej post, jak to zrobiłem, Spójrz. –

0

Po prostu ustaw SCALER.CROP.REGION na captureBuilder. Możesz to zrobić w następujący sposób:

yourCapturebuilder.(CaptureRequest.SCALER_CROP_REGION, newZoom); 

W inny sposób, jeśli chcesz zachować Zoom w swoich preferencjach. Proponuję zrobić coś takiego: zapisz Rect w preferencją jako String, a później odzyskać je z niego korzystać, lub zadzwonić go za każdym razem po otwarciu aparatu:

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

Później wywołać tę metodę, aby ustawić zoom dinamicznie:

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; 

    } 

Mam nadzieję, że ci to pomoże!