Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do you take high resolution images using Camera.takePicture()?

I'm implementing an in-app camera and every time I take a picture my image is 320x240, though my phone's camera is capable of much higher resolutions (Galaxy Nexus). I couldn't find a parameter for setting the resolution, so how do I up the resolution of images I am taking? Here's the relevant code:

@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();
    }
}
like image 639
Jason Robinson Avatar asked May 15 '12 17:05

Jason Robinson


3 Answers

Use params.setPictureSize(). See Camera.Parameters for more information.

Ensure that you call params.getSupportedPictureSizes() first to get an array of supported picture sizes. Then choose a size from the list and use the setPictureSize() method to set the desired size.

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); 
like image 154
CSmith Avatar answered Sep 19 '22 06:09

CSmith


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); 
like image 22
Hamze Sheyikh Shoaei Avatar answered Sep 19 '22 06:09

Hamze Sheyikh Shoaei


Ensure that you call camera.getSupportedPictureSizes() first to get an array of supported picture sizes.

Actually it's params.getSupportedPictureSizes();

like image 33
ezfn Avatar answered Sep 18 '22 06:09

ezfn