Estoy tratando de capturar una foto con la cámara. La vista previa por defecto en el modo de paisaje que yo podría cambiar para el modo de retrato utilizando

    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 en una carpeta myImages. Pero las imágenes se gira. (mira como se captura la imagen en el modo de paisaje)

Entonces, ¿cómo puedo rotar la imagen capturada y guardar la misma?

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 CameraPreview de la clase es el mismo desde el sitio del desarrollador http://developer.android.com/guide/topics/media/camera.html

Nota: estoy usando la cámara trasera no la parte frontal frente a la cámara.

Respondo pregunta similar en otro post stackoverflow.com/a/34323194/4847767

OriginalEl autor | 2013-04-21

3 Comentarios

  1. 33

    Yo se enfrentó al mismo problema al tomar la foto desde la cámara en el modo de retrato. Por debajo de líneas de código solucionado 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);
    }

    Llamada setCameraDisplayOrientation() método en surfaceCreated de devolución de llamada como la siguiente:

    @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() de 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);
    }
    });
    Yo también aplica la misma solución para el mismo problema, pero al iniciar me dieron la de Error de memoria. Entonces me comprimido almacenado de mapa de bits para deshacerse de esta situación. pero Este proceso es muy lento, mientras que la creación de nuevos mapa de bits de la pantalla de mi espera. por medio minuto de mi app pegado en una pantalla negra. ¿tienes alguna solución
    +1 coz ur sugerencia es útil. Gracias
    A mí me funcionó. Gracias.
    u puede pls dime dónde debo necesidad de escribir la Orientación de código como mi imagen se rota en el caso de la única cámara frontal ……
    Me estoy haciendo la imagen girada desde la parte trasera de la cámara por este código, sino en la fuente de la cámara la imagen se rota 180 grados. ¿qué debo hacer para que.

    OriginalEl autor Hemant G

  2. 1

    A continuación el código funcionó para mí Frontal frente a la cámara.

    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) {
    }
    }
    devolverá null mapa de bits no funciona @Trushal

    OriginalEl autor Trushal Patel

  3. 1

    Sí, he intentado de la manera en la respuesta, que trabaja para la cámara trasera, cámara frontal, es necesario girar 270 no 90. 🙂

    OriginalEl autor zhonglin

Dejar respuesta

Please enter your comment!
Please enter your name here