2016-08-24 10 views
1

사용하지 않는 Camera Api 대신 Camera2 Api를 사용하기 시작했지만 문제가 있습니다. 나는ImageReader on Camera2 Api android

ImageReader.newInstance(100, 130, ImageFormat.YUV_420_888, 2); 

와 ImageReader를 설정하지만 onImageAvailable에서 이미지 크기를 로그인 할 때 :

Image img = null; 
     img = imageReader.acquireLatestImage(); 

     if(img != null){ 

      Log.d("Dimen3", Integer.toString(img.getHeight()) + " " + img.getWidth());} 

은 말한다 :

08-24 18:25:43.115 28363-28363/com.example.ale.camera2prova D/Dimen3: 144 176 

왜 크기가 변경?

답변

0

질문을 올바르게 이해하면 ImageReader 이미지에 임의의 크기를 사용할 수없는 이유가 무엇인지 묻는 중입니다. 이에 대한 대답은 ImageReader를 어떻게 디자인했는지입니다. ImageReader는 아마 당신이 요청한 크기에 가장 가까운 미리 정의 된 크기를 선택합니다. 이를 방지하려면 미리 정의 된 목록에서 크기를 선택하십시오.

private Size selectImageSize() { 
    CameraCharacteristics cameraCharacteristics = null; 
    try { 
     cameraCharacteristics = cameraManager.getCameraCharacteristics(cameraId); 
    } catch (CameraAccessException e) { 
     return null; 
    } 

    StreamConfigurationMap streamConfigurationMap = cameraCharacteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP); 
    if (streamConfigurationMap == null) { 
     return null; 
    } 
    jpegSizes = streamConfigurationMap.getOutputSizes(ImageFormat.JPEG); 

    Display display = getWindowManager().getDefaultDisplay(); 
    Point size = new Point(); 
    display.getSize(size); 
    int screenLength = size.x; 
    if (screenLength < size.y) { 
     screenLength = size.y; 
    } 

    int index = 0; 
    int finalIndex = 0; 
    int finalJpegLength = Integer.MAX_VALUE; 
    for (Size jpegSize : jpegSizes) { 
     int jpegLength = jpegSize.getWidth(); 
     if (jpegLength < jpegSize.getHeight()) { 
      jpegLength = jpegSize.getHeight(); 
     } 
     if (jpegLength >= screenLength) { 
      if (jpegLength < finalJpegLength) { 
       finalJpegLength = jpegLength; 
       finalIndex = index; 
      } 
     } 
     index++; 
    } 

    Size returnSize = new Size(jpegSizes[finalIndex].getWidth(), jpegSizes[finalIndex].getHeight()); 
    return returnSize; 
} 

내가 같거나보다 큰 가장 작은 이미지 크기를 얻기 위해 노력하고 있어요 : 나는 크기의 목록을 가져옵니다 및 화면 크기와 같거나 더 큰 가장 작은 하나를 선택 조금 루틴을 썼다 화면 크기는 장치 화면을 가득 채울 이미지를 제공하면서 가장 빠른 속도를 제공하기 때문에 사용합니다.

0

휴대 전화가 지원하는 사용 가능한 크기 만 imageReader에 설정할 수 있습니다. 당신은이 방법을 알 수 있습니다 : 당신은 당신의 pictureSizes의 결과는 우리가 얘기하는 ImageReader의 어떤 형식에서 따라, 또한 (전화 당신의 ImageReader를 설정 할 수

public static Size[] previewSizes; 
public static Size[] videoSizes; 
public static Size[] pictureSizes; 

    StreamConfigurationMap map = cameraCharacteristics.get(     CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP); 

     previewSizes = map.getOutputSizes(SurfaceTexture.class); 
     videoSizes = map.getOutputSizes(MediaRecorder.class); 
     pictureSizes = map.getOutputSizes(ImageFormat.JPEG); 

, 일부 장치는 YUV의 일부 크기를 지원합니다 또는 JPEG 형식이지만 RAW에서는 그렇지 않습니다).

또한 특정 크기로 여러 개의 ImageReader를 구성 할 수 없으므로 많은 모드로 카메라 앱에서 작업하는 경우 문제가됩니다. 다음 링크에서 자세한 내용을 볼 수 있습니다. https://developer.android.com/reference/android/hardware/camera2/CameraDevice.html

희망이 있으면 도움이 될 것입니다.