2016-03-13 88 views
6

Im mới trong máy ảnh android2 APi. Tôi chỉ chuyển tất cả dự án của mình sang Camera2 Api mới. Tôi đã sử dụng Camera2Basic example làm poin bắt đầu.camera android2 xử lý zoom

Im bây giờ cố gắng xử lý zoom bằng cách thêm này:

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

Và đây:

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

Nhưng sau khi tôi bị bắt, kết quả hình ảnh là không có zoom. Làm thế nào tôi có thể làm cho nó vui vẻ. Cảm ơn tất cả.

Cập nhật Cần thêm captBuilder.set (CaptureRequest.SCALER_CROP_REGION, thu phóng); Để capture phương thứcStillPicture().

+0

bạn đã sửa chưa? –

+0

Có, Đã thêm giải pháp của tôi bên dưới –

+0

phương thức captureStillPicture() là gì ??? – user3819810

Trả lời

4

Cần thêm captureBuilder.set(CaptureRequest.SCALER_CROP_REGION, zoom); Để chụp phương thứcStillPicture().

2

Bạn chỉ đặt SCALER_CROP_REGION trên CaptureRequestBuilder cho đầu ra máy ảnh xem trước định kỳ. Bạn chỉ cần thêm cùng thuộc tính vùng cắt vào CaptureRequestBuilder sử dụng JPEG Surface của ImageSaver làm đầu ra và bạn sẽ được thiết lập.

+0

Bạn có thể vui lòng hơn không? Trong đó phương pháp nó shuld được hiển thị? –

+0

@EliElezra bạn phải gọi số. (CaptureRequest.SCALER_CROP_REGION) trong trình tạo mà bạn đã gửi tới ảnh khi bạn chụp. Trình xây dựng chứa tất cả thông tin về bản xem trước mà bạn đang xem và ảnh mà nó sẽ lưu. Bạn có thể sửa đổi các thông số cài đặt xem trước và ảnh trong trình tạo của mình. Bạn có thể xem thêm thông tin tại: http://developer.android.com/intl/es/reference/android/hardware/camera2/CameraCharacteristics.html PD: Tôi cho phép bạn đăng bài dưới đây về cách tôi đã làm, hãy xem. –

0

Chỉ cần đặt SCALER.CROP.REGION thành captureBuilder. Bạn có thể thực hiện theo cách này:

yourCapturebuilder.(CaptureRequest.SCALER_CROP_REGION, newZoom); 

Nói cách khác, nếu bạn muốn giữ tùy chọn Thu phóng. Tôi đề nghị bạn làm một cái gì đó như thế này: Lưu Rect trong một sở thích như là một String và sau đó khôi phục nó để sử dụng nó, hoặc gọi cho nó mọi lúc bạn mở camera:

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

Sau đó gọi phương pháp này để thiết lập các zoom 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; 

    } 

Hy vọng nó sẽ giúp bạn!

Các vấn đề liên quan