Android 安卓定制相机的图像失真

Android 安卓定制相机的图像失真,android,Android,我想让android定制相机处于纵向模式。我已经做了所有的事情,但现在我的主要问题是我的图像被相机扭曲。我检查了之前发布的所有解决方案,但没有任何帮助。你能帮我吗。我的相机预览课程是:- public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback { private SurfaceHolder mSurfaceHolder; private Camera mCam

我想让android定制相机处于纵向模式。我已经做了所有的事情,但现在我的主要问题是我的图像被相机扭曲。我检查了之前发布的所有解决方案,但没有任何帮助。你能帮我吗。我的相机预览课程是:-

   public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback 
  {
     private SurfaceHolder mSurfaceHolder;
     private Camera mCamera;

//Constructor that obtains context and camera
public CameraPreview(Context context, Camera camera) {
    super(context);
    this.mCamera = camera;

    this.mSurfaceHolder = this.getHolder();
    this.mSurfaceHolder.addCallback(this); // we get notified when underlying surface is created and destroyed
    this.mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); //this is a deprecated method, is not requierd after 3.0
}

@Override
public void surfaceCreated(SurfaceHolder surfaceHolder) {
    try {
        mCamera.setPreviewDisplay(surfaceHolder);
        mCamera.startPreview();
    } catch (IOException e) {
      // left blank for now
    }

}

@Override
public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
    mCamera.stopPreview();
    mCamera.release();
}

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






    // start preview with new settings
    try {



        CameraActivity a=new CameraActivity();


        Camera.Parameters parameters = mCamera.getParameters();

         parameters.set("zoom", "2.0");
           parameters.set("taking-picture-zoom", "20");




           Camera.Size size = getBestPreviewSize(width, height,parameters) ;






        // Log.w("parameters"," "+  mCamera.getParameters().getSupportedPreviewSizes());


         parameters.setPreviewSize(size.width, size.height);



         Toast.makeText(getContext(), "width" +size.width, Toast.LENGTH_LONG).show();

         Toast.makeText(getContext(), "height" +size.height, Toast.LENGTH_LONG).show();

        int displayRotation = a.display.getRotation();



          switch (displayRotation)  {
                case Surface.ROTATION_0:     
                    mCamera.setDisplayOrientation(90);    

                    //Log.w("enter here","aaa");break;

                case Surface.ROTATION_90:    
                    // parameters.setPreviewSize(size.width, size.height);
                    break;

                case Surface.ROTATION_180: 
                //   parameters.setPreviewSize(size.height,size.width);

                    break;

                case Surface.ROTATION_270:    
                     //parameters.setPreviewSize(size.width, size.height);

                    mCamera.setDisplayOrientation(180);

                //  Log.w("enter here","aaa");
                break;

            }




        mCamera.setPreviewDisplay(surfaceHolder);
        mCamera.startPreview();
    } catch (Exception e) {
        // intentionally left blank for a test
    }
}


Camera.Size getBestPreviewSize(int width, int height, Camera.Parameters parameters) {
    Camera.Size result=null;
    float dr = Float.MAX_VALUE;
    float ratio = (float)width/(float)height;

    for (Camera.Size size : parameters.getSupportedPreviewSizes()) {
        float r = (float)size.width/(float)size.height;
        if( Math.abs(r - ratio) < dr && size.width <= width && size.height <= height ) {
            dr = Math.abs(r - ratio);
            result = size;
        }
    }

    return result;
}
公共类CameraPreview扩展了SurfaceView实现了SurfaceHolder.Callback { 私人地表持有人; 私人摄像机麦卡梅拉; //获取上下文和摄影机的构造函数 公共摄像机回顾(上下文、摄像机){ 超级(上下文); this.mCamera=摄像机; this.mSurfaceHolder=this.getHolder(); this.mSurfaceHolder.addCallback(this);//我们在创建和销毁底层曲面时收到通知 this.mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);//这是一种不推荐使用的方法,在3.0之后不需要 } @凌驾 已创建的公共空隙表面(表面层表面层){ 试一试{ mCamera.setPreviewDisplay(surfaceHolder); mCamera.startPreview(); }捕获(IOE异常){ //暂时留白 } } @凌驾 公共空间表面已覆盖(表面层表面层){ mCamera.stopPreview(); mCamera.release(); } @凌驾 public void surfaceChanged(SurfaceHolder SurfaceHolder,int格式, 整数宽度,整数高度){ //使用新设置开始预览 试一试{ CameraActivity a=新的CameraActivity(); Camera.Parameters=mCamera.getParameters(); 参数设置(“缩放”、“2.0”); 参数设置(“拍照变焦”、“20”); Camera.Size Size=getBestPreviewSize(宽度、高度、参数); //Log.w(“参数”,“mCamera.getParameters().getSupportedPreviewSizes()); parameters.setPreviewSize(size.width、size.height); Toast.makeText(getContext(),“width”+size.width,Toast.LENGTH\u LONG.show(); Toast.makeText(getContext(),“height”+size.height,Toast.LENGTH\u LONG.show(); int displayRotation=a.display.getRotation(); 开关(显示旋转){ 外壳表面旋转0: mCamera.setDisplayOrientation(90); //Log.w(“在此输入”、“aaa”);中断; 外壳表面旋转90度: //parameters.setPreviewSize(size.width、size.height); 打破 外壳表面旋转180度: //参数.setPreviewSize(大小、高度、大小、宽度); 打破 外壳表面。旋转_270: //parameters.setPreviewSize(size.width、size.height); mCamera.setDisplayOrientation(180); //Log.w(“在此输入”、“aaa”); 打破 } mCamera.setPreviewDisplay(surfaceHolder); mCamera.startPreview(); }捕获(例外e){ //故意留下空白进行测试 } } Camera.Size getBestPreviewSize(整数宽度、整数高度、Camera.Parameters){ Camera.Size结果=null; float dr=float.MAX_值; 浮动比率=(浮动)宽度/(浮动)高度; 对于(Camera.Size:parameters.getSupportedPreviewSizes()){ 浮动r=(浮动)大小.宽度/(浮动)大小.高度;
如果(Math.abs(r-ratio) private Camera.Size getBestPreviewSize(int width, int height) { Camera.Size result=null; Camera.Parameters p = mCamera.getParameters(); for (Camera.Size size : p.getSupportedPreviewSizes()) { if (size.width<=width && size.height<=height || (size.height <= width && size.width <= height)) { if (result==null) { result=size; } else { int resultArea=result.width*result.height; int newArea=size.width*size.height; if (newArea>resultArea) { result=size; } } } } return result; }