如何使用Camera.takePicture你把高分辨率的图像()? [英] How do you take high resolution images using Camera.takePicture()?

查看:3075
本文介绍了如何使用Camera.takePicture你把高分辨率的图像()?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我实现应用程序内的摄像头和我每次拍照我的形象是320×240,虽然我的手机的摄像头能够更高的分辨率(Galaxy Nexus的)。我无法找到设置分辨率的参数,所以我怎么了图片,我采取的分辨率是多少?以下是有关code:

  @覆盖
公共无效surfaceCreated(SurfaceHolder持有者){

    setSurfaceHolder(保持器);
}

@覆盖
公共无效surfaceDestroyed(SurfaceHolder持有者){

    setSurfaceHolder(空);
}

私人无效attachCameraToSurface(摄像头摄像头,SurfaceHolder持有人){

    尝试 {
        camera.set previewDisplay(保持器);
        瑟酮preVIEW(真正的);
    }
    赶上(IOException异常E){
        Log.e(CameraFragment,异常的attachCameraToSurface(),E);
    }
}

@覆盖
公共无效surfaceChanged(SurfaceHolder持有人,INT格式,诠释的宽度,高度INT){

    摄像头摄像头= getCamera的();
    如果(相机== NULL){
        返回;
    }

    Camera.Size大小= getCamera的previewSize(摄像头);
    Camera.Parameters PARAMS = camera.getParameters();
    params.set previewSize(size.width,size.height);
    camera.setParameters(PARAMS);

    attachCameraToSurface(摄像头,支架);

    启动preVIEW();
}

私人Camera.Size getCamera的previewSize(摄像机镜头){

    Camera.Parameters PARAMS = camera.getParameters();
    名单< Camera.Size> supportedSizes = params.getSupported previewSizes();

    矩形框= getSurfaceHolder()getSurfaceFrame()。
    INT宽度= frame.width();
    INT高= frame.height();

    对于(Camera.Size大小:supportedSizes){
        如果(size.width> =宽度|| size.height> =身高){
            返回的大小;
        }
    }

    返回supportedSizes.get(0);
}

@覆盖
公共无效的onClick(视图v){

    开关(v.getId()){
        案例R.id.camera_action_ImageView:
            。getCamera的()takePicture(getShutterCallback(),空,新JpegPictureCallback());
        打破;
    }
}

私有类JpegPictureCallback实现PictureCallback {

    @覆盖
    公共无效onPictureTaken(byte []的数据,摄像头摄像头){

        点阵位图= NULL;
        尝试 {
            位= BitmapFactory.de codeByteArray(数据,0,data.length);
        }
        赶上(OutOfMemoryError异常E){
            Log.e(CameraFragment,内存不足从相机图像解码,E);
            返回;
        }
        数据= NULL;

        如果(位图!= NULL){
            新SavePictureWorker(getActivity()).execute(位图);
        }

        启动preVIEW();
    }
}
 

解决方案

使用 params.setPictureSize()。请参阅 Camera.Parameters 了解更多信息。

请确保你调用 params.getSupportedPictureSizes()第一个获得支持的图片大小的数组。然后从列表中选择一个的大小和使用setPictureSize()方法来设置所需的大小。

  Camera.Parameters PARAMS = camera.getParameters();
名单< Camera.Size> supportedSizes = params.getSupportedPictureSizes();
。
。
Camera.Size sizePicture =(从supportedSizes列表尺寸之一);
。
params.setPictureSize(sizePicture.width,sizePicture.height);
 

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

解决方案

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

这篇关于如何使用Camera.takePicture你把高分辨率的图像()?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆