Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


La vista previa de la cámara está en modo vertical, pero la imagen capturada se gira

Estoy tratando de capturar una foto usando la cámara. La vista previa por defecto estaba en modo horizontal, que podría cambiar a modo vertical usando

setCameraDisplayOrientation(this,1, mCamera); public static void setCameraDisplayOrientation(Activity activity, int cameraId, android.hardware.Camera camera) { android.hardware.Camera.CameraInfo info = new android.hardware.Camera.CameraInfo(); android.hardware.Camera.getCameraInfo(cameraId, info); int rotation = activity.getWindowManager().getDefaultDisplay() .getRotation(); int degrees = 0; switch (rotation) { case Surface.ROTATION_0: degrees = 0; break; case Surface.ROTATION_90: degrees = 90; break; case Surface.ROTATION_180: degrees = 180; break; case Surface.ROTATION_270: degrees = 270; break; } int result; if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) { result = (info.orientation + degrees) % 360; result = (360 - result) % 360; // compensate the mirror } else { // back-facing result = (info.orientation - degrees + 360) % 360; } camera.setDisplayOrientation(result); } 

La imagen capturada se almacena bajo una carpeta myImages. Pero las imágenes se rotan. (Parece que la imagen se captura en modo horizontal)

Entonces, ¿cómo puedo girar la imagen capturada y guardar lo mismo?

 public class MainActivity extends Activity { private static final int REQUEST_CODE = 1; ImageView imageView; Button b; private Camera mCamera; private CameraPreview mPreview; private Bitmap bitmap; private PictureCallback mPicture; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); boolean check =checkCameraHardware(MainActivity.this); if(check) { mCamera = getCameraInstance(); // mCamera.setDisplayOrientation(90); setCameraDisplayOrientation(this, 1, mCamera);//requires min sdk 9 } // Create an instance of Camera mPicture = new PictureCallback() { @Override public void onPictureTaken(byte[] data, Camera camera) { File imagesFolder = new File(Environment.getExternalStorageDirectory(), "MyImages"); if(!imagesFolder.exists()) imagesFolder.mkdirs(); File pictureFile = new File(imagesFolder, "image.jpg"); try { FileOutputStream fos = new FileOutputStream(pictureFile); System.out.println("hello"); fos.write(data); fos.close(); } catch (FileNotFoundException e) { Log.d("No File", "File not found: " + e.getMessage()); } catch (IOException e) { //Log.d(TAG, "Error accessing file: " + e.getMessage()); } } }; // Create our Preview view and set it as the content of our activity. mPreview = new CameraPreview(this, mCamera); FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview); preview.addView(mPreview); b = (Button) findViewById(R.id.button_capture); b.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub mCamera.takePicture(null, null, mPicture); Toast.makeText(MainActivity.this, "Called",1000).show(); } }); } public static void setCameraDisplayOrientation(Activity activity, int cameraId, android.hardware.Camera camera) { android.hardware.Camera.CameraInfo info = new android.hardware.Camera.CameraInfo(); android.hardware.Camera.getCameraInfo(cameraId, info); int rotation = activity.getWindowManager().getDefaultDisplay() .getRotation(); int degrees = 0; switch (rotation) { case Surface.ROTATION_0: degrees = 0; break; case Surface.ROTATION_90: degrees = 90; break; case Surface.ROTATION_180: degrees = 180; break; case Surface.ROTATION_270: degrees = 270; break; } int result; if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) { result = (info.orientation + degrees) % 360; result = (360 - result) % 360; // compensate the mirror } else { // back-facing result = (info.orientation - degrees + 360) % 360; } camera.setDisplayOrientation(result); } private boolean checkCameraHardware(Context context) { if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)){ // this device has a camera Toast.makeText(this, "Phone has camera", Toast.LENGTH_LONG).show(); return true; } else { // no camera on this device Toast.makeText(this, "Phone has no camera", Toast.LENGTH_LONG).show(); return false; } } public static Camera getCameraInstance(){ Camera c = null; try { c = Camera.open(); // attempt to get a Camera instance } catch (Exception e){ // Camera is not available (in use or does not exist) } return c; // returns null if camera is unavailable } @Override protected void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); mCamera.release(); } } 

La clase CameraPreview es la misma del sitio del desarrollador http://developer.android.com/guide/topics/media/camera.html

Nota: Estoy utilizando la cámara trasera no la cámara frente a frente.

  • ¿Está com.android.camera.action.CROP no disponible para Android jelly bean 4.3?
  • 60 / 120fps vista previa de datos en un dispositivo Android?
  • Error de la cámara "No se puede conectar a la cámara" o en algunos teléfonos aparece el error "La cámara está usando otra aplicación"
  • Cámara frontal tomar captura muy oscuro en android
  • ¿Cómo utilizar el feed de cámara en vivo como un fondo de actividad?
  • ¿Cómo obtener datos de vista previa sin procesar de un objeto de cámara al menos 15 cuadros por segundo en Android?
  • Tomar la imagen de la cámara personalizada se estira cuando guardar en ImageView
  • Cuando toma la foto get - java.lang.Throwable: file: // Uri expuesto a través de ClipData.Item.getUri ()
  • 3 Solutions collect form web for “La vista previa de la cámara está en modo vertical, pero la imagen capturada se gira”

    Me enfrenté al mismo problema al tomar fotos de la cámara en el modo retrato. Debajo de las líneas de código resuelto mi problema:

     public static void setCameraDisplayOrientation(Activity activity, int cameraId, android.hardware.Camera camera) { android.hardware.Camera.CameraInfo info = new android.hardware.Camera.CameraInfo(); android.hardware.Camera.getCameraInfo(cameraId, info); int rotation = activity.getWindowManager().getDefaultDisplay().getRotation(); int degrees = 0; switch (rotation) { case Surface.ROTATION_0: degrees = 0; break; case Surface.ROTATION_90: degrees = 90; break; case Surface.ROTATION_180: degrees = 180; break; case Surface.ROTATION_270: degrees = 270; break; } int result; if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) { result = (info.orientation + degrees) % 360; result = (360 - result) % 360; // compensate the mirror } else { // back-facing result = (info.orientation - degrees + 360) % 360; } camera.setDisplayOrientation(result); } 

    Llame setCameraDisplayOrientation() método setCameraDisplayOrientation() en la función callback surfaceCreated como sigue:

     @Override public void surfaceCreated(SurfaceHolder holder) { camera = Camera.open(); setCameraDisplayOrientation(getActivity(), CameraInfo.CAMERA_FACING_BACK, camera); } 

    Tuve que girar la imagen en la cámara onPictureTaken() devolución de llamada:

     camera.takePicture(null, null, new PictureCallback() { @Override public void onPictureTaken(byte[] data, Camera camera) { if (data != null) { int screenWidth = getResources().getDisplayMetrics().widthPixels; int screenHeight = getResources().getDisplayMetrics().heightPixels; Bitmap bm = BitmapFactory.decodeByteArray(data, 0, (data != null) ? data.length : 0); if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) { // Notice that width and height are reversed Bitmap scaled = Bitmap.createScaledBitmap(bm, screenHeight, screenWidth, true); int w = scaled.getWidth(); int h = scaled.getHeight(); // Setting post rotate to 90 Matrix mtx = new Matrix(); mtx.postRotate(90); // Rotating Bitmap bm = Bitmap.createBitmap(scaled, 0, 0, w, h, mtx, true); }else{// LANDSCAPE MODE //No need to reverse width and height Bitmap scaled = Bitmap.createScaledBitmap(bm, screenWidth,screenHeight , true); bm=scaled; } photoPreview.setImageBitmap(bm); } isImageCaptured = true; photoPreview.setVisibility(View.VISIBLE); surfaceView.setVisibility(View.GONE); } }); 

    Debajo del código trabajó para mí para la cámara frente a frente.

     if (data != null) { try { int screenWidth = getResources().getDisplayMetrics().widthPixels; int screenHeight = getResources().getDisplayMetrics().heightPixels; bm = BitmapFactory.decodeByteArray(data, 0, (data != null) ? data.length : 0); CameraInfo info = new CameraInfo(); Camera.getCameraInfo(cameraFace, info); if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) { // Notice that width and height are reversed // Bitmap scaled = Bitmap.createScaledBitmap(bm, // screenHeight, screenWidth, true); // int w = scaled.getWidth(); // int h = scaled.getHeight(); // Setting post rotate to 90 Matrix mtx = new Matrix(); mtx.postRotate(90); if (cameraFace == CameraInfo.CAMERA_FACING_FRONT) mtx.postRotate(180); // Rotating Bitmap bm = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(), bm.getHeight(), mtx, true); } else {// LANDSCAPE MODE Bitmap scaled = Bitmap.createScaledBitmap(bm, screenWidth, screenHeight, true); bm = scaled; } } catch (Exception e) { } catch (Error e) { } } 

    Sí, he intentado el camino en la respuesta, funciona para la cámara trasera, para la cámara frontal, es necesario girar 270 no 90. 🙂

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.