【问题标题】:How do you take high resolution images using Camera.takePicture()?如何使用 Camera.takePicture() 拍摄高分辨率图像?
【发布时间】:2012-05-23 05:59:24
【问题描述】:

我正在实现一个应用内摄像头,每次拍照时,我的图像都是 320x240,尽管我手机的摄像头能够提供更高的分辨率(Galaxy Nexus)。我找不到用于设置分辨率的参数,那么如何提高我正在拍摄的图像的分辨率?以下是相关代码:

@Override
public void surfaceCreated( SurfaceHolder holder ) {

    setSurfaceHolder( holder );
}

@Override
public void surfaceDestroyed( SurfaceHolder holder ) {

    setSurfaceHolder( null );
}

private void attachCameraToSurface( Camera camera, SurfaceHolder holder ) {

    try {
        camera.setPreviewDisplay( holder );
        setInPreview( true );
    }
    catch (IOException e) {
        Log.e( "CameraFragment", "Exception in attachCameraToSurface()", e );
    }
}

@Override
public void surfaceChanged( SurfaceHolder holder, int format, int width, int height ) {

    Camera camera = getCamera();
    if ( camera == null ) {
        return;
    }

    Camera.Size size = getCameraPreviewSize( camera );
    Camera.Parameters params = camera.getParameters();
    params.setPreviewSize( size.width, size.height );
    camera.setParameters( params );

    attachCameraToSurface( camera, holder );

    startPreview();
}

private Camera.Size getCameraPreviewSize( Camera camera ) {

    Camera.Parameters params = camera.getParameters();
    List<Camera.Size> supportedSizes = params.getSupportedPreviewSizes();

    Rect frame = getSurfaceHolder().getSurfaceFrame();
    int width = frame.width();
    int height = frame.height();

    for (Camera.Size size : supportedSizes) {
        if ( size.width >= width || size.height >= height ) {
            return size;
        }
    }

    return supportedSizes.get( 0 );
}

@Override
public void onClick( View v ) {

    switch (v.getId()) {
        case R.id.camera_action_ImageView:
            getCamera().takePicture( getShutterCallback(), null, new JpegPictureCallback() );
        break;
    }
}

private class JpegPictureCallback implements PictureCallback {

    @Override
    public void onPictureTaken( byte[] data, Camera camera ) {

        Bitmap bitmap = null;
        try {
            bitmap = BitmapFactory.decodeByteArray( data, 0, data.length );
        }
        catch (OutOfMemoryError e) {
            Log.e( "CameraFragment", "Out of memory decoding image from camera.", e );
            return;
        }
        data = null;

        if ( bitmap != null ) {
            new SavePictureWorker( getActivity() ).execute( bitmap );
        }

        startPreview();
    }
}

【问题讨论】:

    标签: android android-camera


    【解决方案1】:

    使用params.setPictureSize()。有关详细信息,请参阅 Camera.Parameters

    确保您首先调用params.getSupportedPictureSizes() 以获取支持的图片尺寸数组。然后从列表中选择一个大小并使用setPictureSize() 方法设置所需的大小。

    Camera.Parameters params = camera.getParameters();
    List<Camera.Size> supportedSizes = params.getSupportedPictureSizes();
    .
    .
    Camera.Size sizePicture = (one of the sizes from supportedSizes list);
    .
    params.setPictureSize(sizePicture.width, sizePicture.height);
    

    【讨论】:

    • 不知道我怎么错过了那个。谢谢。
    • 你是天才的工作,最后我在 3 天后找到了一个解决方案
    • 如何获取Camera.Size sizePicture 请告诉我
    • 您可以浏览支持的尺寸集合并选择一个。如果您想要最高分辨率,您可以按分辨率(即宽度 * 高度)对集合进行排序,然后选择最大的。
    【解决方案2】:
    Camera.Parameters param;
    param = camera.getParameters();
    
    Camera.Size bestSize = null;
    List<Camera.Size> sizeList = camera.getParameters().getSupportedPreviewSizes();
    bestSize = sizeList.get(0);
    for(int i = 1; i < sizeList.size(); i++){
        if((sizeList.get(i).width * sizeList.get(i).height) > (bestSize.width * bestSize.height)){
            bestSize = sizeList.get(i);
        }
    }
    
    List<Integer> supportedPreviewFormats = param.getSupportedPreviewFormats();
    Iterator<Integer> supportedPreviewFormatsIterator = supportedPreviewFormats.iterator();
    while(supportedPreviewFormatsIterator.hasNext()){
        Integer previewFormat =supportedPreviewFormatsIterator.next();
        if (previewFormat == ImageFormat.YV12) {
            param.setPreviewFormat(previewFormat);
        }
    }
    
    param.setPreviewSize(bestSize.width, bestSize.height);
    
    param.setPictureSize(bestSize.width, bestSize.height);
    
    camera.setParameters(param);
    camera.takePicture(shutterCallback, rawCallback, jpegCallback);
    

    【讨论】:

      【解决方案3】:

      确保首先调用 camera.getSupportedPictureSizes() 以获取支持的图片尺寸数组。

      其实是params.getSupportedPictureSizes();

      【讨论】:

        【解决方案4】:

        我认为, 您可以使用setPictureSize (int width, int height)。用于设置图像尺寸(以像素为单位)。

        【讨论】:

          【解决方案5】:
          Camera.Parameters parameters = camera.getParameters();
                      List<Camera.Size> sizes = parameters.getSupportedPictureSizes();
                      int w = 0, h = 0;
                      for (Camera.Size size : sizes) {
                          if (size.width > w || size.height > h) {
                              w = size.width;
                              h = size.height;
                          }
          
                      }
                      parameters.setPictureSize(w, h);
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-11-20
            相关资源
            最近更新 更多