android手机拍照问题,图像反转90度

============问题描述============


我使用的是竖屏预览摄像头,但是预览的图像有90度反转,但是拍摄的图片正常也是90度反转。
如果使用横屏预览,图像预览正常,但是拍出的图片跟预览是90度反转的。
现在我想在竖屏的情况下能够预览和拍摄都正常,如何去做?
下面是代码:
Button takebtn;

	Button savebtn;

	Button cancelbtn;

	private SurfaceView surfaceView;

	private SurfaceHolder surfaceHolder;

	private Camera camera;

	File picture;

	String url;



	@Override

	protected void onCreate(Bundle savedInstanceState) {

		super.onCreate(savedInstanceState);

		Window window = getWindow();

		window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,

				WindowManager.LayoutParams.FLAG_FULLSCREEN);

		setContentView(R.layout.activity_camera);

		initWigdt();

		

	}



	protected void initWigdt() {

		takebtn = (Button) findViewById(R.id.takebtn);

		savebtn = (Button) findViewById(R.id.savebtn);

		cancelbtn = (Button) findViewById(R.id.cancelbtn);



		surfaceView = (SurfaceView) findViewById(R.id.surview);

		surfaceHolder = surfaceView.getHolder();

		surfaceHolder.addCallback(surfaceCallback);

		surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);



		takebtn.setOnClickListener(new OnClickListener() {



			@Override

			public void onClick(View v) {

				// TODO Auto-generated method stub

				takePic();

			}

		});

	}



	// 保存图片

	private void takePic() {

		camera.takePicture(null, null, pictureCallback);

	}



	// 显示图片

	Camera.PictureCallback pictureCallback = new Camera.PictureCallback() {

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

			new SavePictureTask().execute(data);

			camera.startPreview();

		}

	};



	// 保存至手机卡 中

	class SavePictureTask extends AsyncTask<byte[], String, String> {

		@Override

		protected String doInBackground(byte[]... params) {

			String name = String.valueOf(new Date().getTime());

			url = "/sdcard/" + name + ".jpg";

			File picture = new File(url);

			try {

				FileOutputStream fos = new FileOutputStream(picture.getPath());

				fos.write(params[0]);

				fos.close();

			} catch (Exception e) {

				e.printStackTrace();

				Log.e("save", e.getMessage());

			}

			System.out.println("照片保存完成");

			Intent aintent = new Intent(CameraActivity.this, MainActivity.class);

			aintent.putExtra("url", url);

			setResult(1, aintent);

			CameraActivity.this.finish();

			return null;

		}

	}



	protected void setDisplayOrientation(Camera camera, int angle) {

		Method downPolymorphic;

		try {

			downPolymorphic = camera.getClass().getMethod(

					"setDisplayOrientation", new Class[] { int.class });

			if (downPolymorphic != null)

				downPolymorphic.invoke(camera, new Object[] { angle });

		} catch (Exception e1) {

			e1.printStackTrace();

		}

	}



	SurfaceHolder.Callback surfaceCallback = new SurfaceHolder.Callback() {



		public void surfaceCreated(SurfaceHolder holder) {

			camera = Camera.open();



			System.out.println("摄像头open完成");

			try {

				camera.setPreviewDisplay(holder);



			} catch (IOException e) {

				camera.release();

				camera = null;

			}

		}



		public void surfaceChanged(SurfaceHolder holder, int format, int width,

				int height) {

			Camera.Parameters parameters = camera.getParameters();

			parameters.setPictureFormat(PixelFormat.JPEG);

			if (Integer.parseInt(Build.VERSION.SDK) >= 8) {// 判断系统版本是否大于等于2.2

				setDisplayOrientation(camera, 90);// 旋转90,前提是当前页portrait,纵向

				Log.e("a", "cc");

			} else { // 系统版本在2.2以下的采用下面的方式旋转

				if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {

					parameters.set("orientation", "portrait");

					parameters.set("rotation", 90);

				}

				if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {

					parameters.set("orientation", "landscape");

					parameters.set("rotation", 90);

				}

				Log.e("c", "dd");

			}

			

			camera.setDisplayOrientation(0);

			camera.setParameters(parameters);

			camera.startPreview();

		}



		public void surfaceDestroyed(SurfaceHolder holder) {

			camera.stopPreview();

			camera.release();

			camera = null;

		}

	};

============解决方案1============


http://asysbang.com/forum.php?mod=viewthread&tid=58&extra=page%3D1

转载于:https://www.cnblogs.com/shaochuyun57/p/4030361.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值