Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/204.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 使用摄像头硬件会降低图像质量_Android_Camera_Android Camera_Android Image - Fatal编程技术网

Android 使用摄像头硬件会降低图像质量

Android 使用摄像头硬件会降低图像质量,android,camera,android-camera,android-image,Android,Camera,Android Camera,Android Image,我一直遵循两个链接为我的应用程序创建自定义相机。我成功地打开了照相机。问题是它降低了图像质量。以下是我一直关注的链接: 我的代码是: 摄像机活动: public class CameraSetter extends Activity { public Context context; public int CAMERA; // ImageView photo_setter; private Camera mCamera = null; private

我一直遵循两个链接为我的应用程序创建自定义相机。我成功地打开了照相机。问题是它降低了图像质量。以下是我一直关注的链接:

我的代码是:

摄像机活动:

public class CameraSetter extends Activity {
    public Context context;
    public int CAMERA;
    // ImageView photo_setter;
    private Camera mCamera = null;
    private CameraView mCameraView = null;

    public CameraSetter() {
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        TypefaceProvider.registerDefaultIconSets();
        setContentView(R.layout.camera_preview);

        Initialize();
    }

    private void Initialize() {
        //photo_setter = (ImageView)findViewById(R.id.imview_camera_setter);


        try {
            mCamera = Camera.open();//you can use open(int) to use different cameras
        } catch (Exception e) {
            Log.d("ERROR", "Failed to get camera: " + e.getMessage());
        }

        if (mCamera != null) {
            mCameraView = new CameraView(this, mCamera);//create a SurfaceView to show camera data
            FrameLayout camera_view = (FrameLayout) findViewById(R.id.camera_view);

            camera_view.addView(mCameraView);//add the SurfaceView to the layout
        }

        //btn to close the application
        ImageButton imgClose = (ImageButton) findViewById(R.id.imgClose);
        imgClose.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                System.exit(0);
            }
        });
    }


}
我的摄影课是:

public class CameraView extends SurfaceView implements SurfaceHolder.Callback {
    private SurfaceHolder mHolder;
    private Camera mCamera;

    public CameraView(Context context, Camera camera) {
        super(context);

        mCamera = camera;
        mCamera.setDisplayOrientation(90);
        //get the holder and set this class as the callback, so we can get camera data here
        mHolder = getHolder();
        mHolder.addCallback(this);
        mHolder.setType(SurfaceHolder.SURFACE_TYPE_NORMAL);
    }

    @Override
    public void surfaceCreated(SurfaceHolder surfaceHolder) {
        try {
            //when the surface is created, we can set the camera to draw images in this surfaceholder
            mCamera.setPreviewDisplay(surfaceHolder);
            mCamera.startPreview();
        } catch (IOException e) {
            Log.d("ERROR", "Camera error on surfaceCreated " + e.getMessage());
        }
    }

    @Override
    public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i2, int i3) {
        if (mHolder.getSurface() == null)//check if the surface is ready to receive camera data
            return;

        try {
            mCamera.stopPreview();
        } catch (Exception e) {
            //this will happen when you are trying the camera if it's not running
        }

        //now, recreate the camera preview
        try {
            mCamera.setPreviewDisplay(mHolder);
            mCamera.startPreview();
        } catch (IOException e) {
            Log.d("ERROR", "Camera error on surfaceChanged " + e.getMessage());
        }
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
//our app has only one screen, so we'll destroy the camera in the surface
        //if you are unsing with more screens, please move this code your activity
        mCamera.stopPreview();
        mCamera.release();
    }
}

我可以使用相同的代码提高图像质量,还是必须做其他事情?

添加surfacechanged可解决此问题:

            Camera.Parameters parameters = mCamera.getParameters();

            parameters.setFlashMode(Camera.Parameters.FLASH_MODE_AUTO);
            parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);
            parameters.setJpegQuality(100);
            parameters.setRotation(90);
            List<Camera.Size> sizes = parameters.getSupportedPictureSizes();
            Camera.Size size = sizes.get(0);
            for(int j=0;j<sizes.size();j++)
            {
                if(sizes.get(j).width > size.width)
                    size = sizes.get(j);
            }
            parameters.setPictureSize(size.width, size.height);
            Display display = ((WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
            if (display.getRotation() == Surface.ROTATION_0) {
                mCamera.setDisplayOrientation(90);
            } else if (display.getRotation() == Surface.ROTATION_270) {
                mCamera.setDisplayOrientation(180);
            }

            mCamera.setParameters(parameters);
Camera.Parameters=mCamera.getParameters();
parameters.setFlashMode(相机.参数.闪光模式自动);
parameters.setFocusMode(相机.参数.聚焦模式\u连续图像);
参数。设置质量(100);
参数设置旋转(90);
列表大小=参数。getSupportedPictureSizes();
Camera.Size=Size.get(0);
用于(int j=0;j size.width)
大小=大小。获取(j);
}
参数.setPictureSize(大小.宽度,大小.高度);
显示显示=((WindowManager)getContext().getSystemService(Context.WINDOW_服务)).getDefaultDisplay();
if(display.getRotation()==Surface.ROTATION\u 0){
mCamera.setDisplayOrientation(90);
}else if(display.getRotation()==Surface.ROTATION_270){
mCamera.setDisplayOrientation(180);
}
mCamera.setParameters(参数);