Le contrôle de l'appareil photo pour prendre des photos en mode portrait n'est pas de faire pivoter les images finales
Je suis en train de contrôle de l'appareil photo Android pour prendre des photos dans un portrait de l'app, mais lorsque j'enregistre l'image, c'est dans paysage. J'ai fait pivoter l'image de 90 sortes avec setCameraDisplayOrientation()
méthode, mais ne fonctionne pas.
Ensuite, j'ai trouvé cette post mais la TAG_ORIENTATION
est 0
(indéfini). Si je prends cette valeur et appliquer une rotation de la valeur, ne fonctionne pas non plus.
Comment je peux prendre une photo en mode portrait et l'enregistrer avec une bonne orientation?
/** Initializes the back/front camera */
private boolean initPhotoCamera() {
try {
camera = getCameraInstance(selected_camera);
Camera.Parameters parameters = camera.getParameters();
// parameters.setPreviewSize(width_video, height_video);
// parameters.set("orientation", "portrait");
// parameters.set("rotation", 1);
// camera.setParameters(parameters);
checkCameraFlash(parameters);
// camera.setDisplayOrientation( 0);
setCameraDisplayOrientation(selected_camera, camera);
surface_view.getHolder().setFixedSize(width_video, height_video);
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(width_video, height_video);
surface_view.setLayoutParams(lp);
camera.lock();
surface_holder = surface_view.getHolder();
surface_holder.addCallback(this);
surface_holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
setPreviewCamera();
} catch (Exception e) {
Log.v("RecordVideo", "Could not initialize the Camera");
return false;
}
return true;
}
public void setCameraDisplayOrientation(int cameraId, Camera camera) {
Camera.CameraInfo info = new Camera.CameraInfo();
Camera.getCameraInfo(cameraId, info);
int rotation = 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);
}
public static Bitmap rotate(Bitmap bitmap, int degree) {
int w = bitmap.getWidth();
int h = bitmap.getHeight();
Matrix mtx = new Matrix();
// mtx.postRotate(degree);
mtx.setRotate(degree);
return Bitmap.createBitmap(bitmap, 0, 0, w, h, mtx, true);
}
@Override
public void onPictureTaken(byte[] data, Camera camera) {
String timeStamp = Calendar.getInstance().getTime().toString();
output_file_name = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM) + File.separator + timeStamp + ".jpeg";
File pictureFile = new File(output_file_name);
if (pictureFile.exists()) {
pictureFile.delete();
}
try {
FileOutputStream fos = new FileOutputStream(pictureFile);
fos.write(data);
Bitmap realImage = BitmapFactory.decodeFile(output_file_name);
ExifInterface exif=new ExifInterface(pictureFile.toString());
Log.d("EXIF value", exif.getAttribute(ExifInterface.TAG_ORIENTATION));
if(exif.getAttribute(ExifInterface.TAG_ORIENTATION).equalsIgnoreCase("6")){
realImage= rotate(realImage, 90);
} else if(exif.getAttribute(ExifInterface.TAG_ORIENTATION).equalsIgnoreCase("8")){
realImage= rotate(realImage, 270);
} else if(exif.getAttribute(ExifInterface.TAG_ORIENTATION).equalsIgnoreCase("3")){
realImage= rotate(realImage, 180);
} else if(exif.getAttribute(ExifInterface.TAG_ORIENTATION).equalsIgnoreCase("0")){
realImage= rotate(realImage, 45);
}
boolean bo = realImage.compress(Bitmap.CompressFormat.JPEG, 100, fos);
fos.close();
Log.d("Info", bo + "");
} catch (FileNotFoundException e) {
Log.d("Info", "File not found: " + e.getMessage());
} catch (IOException e) {
Log.d("TAG", "Error accessing file: " + e.getMessage());
}
}
- J'ai posible solution sur un autre post, si vous voulez vérifier: stackoverflow.com/a/34323194/4847767
Vous devez vous connecter pour publier un commentaire.
Le problème est quand j'ai enregistré l'image je n'ai pas bien faire.
La setCameraDisplayOrientation() méthode permet de modifier la façon dont le aperçu est affiché sans affecter la façon dont l'image est enregistrée (source).
Afin de changer le réel de l'image enregistrée, vous devez définir la rotation paramètre de la Caméra. Vous faites comme ceci:
Votre solution est une sorte de solution de contournement, puisque vous modifiez l'image APRÈS qu'elle a été déjà enregistré. Cette solution est plus propre et ne nécessite pas de tous ces "si", des déclarations avant l'enregistrement de l'image.
int degrees = mActivity.getWindowManager().getDefaultDisplay().getRotation();
pour se débarrasser deswitch
de la construction. Fonctionne très bien.Vous pouvez utiliser la méthode ci-dessous pour générer l'aperçu correctement lorsque vous utilisez l'appareil photo avant.
Ce code va dans surfaceChanged mode de prévisualisation de la caméra
Ce code peut être placé dans une classe statique
Vous pouvez faire Pivoter l'image de cette façon.Il est utilisé uniquement lorsque l'image est prise et nous sommes sur le point d'enregistrer l'image
La Méthode qui sera utilisée pour prendre une photo
La
bitmapImage
contient l'image correcte.code Matrix matrix = new Matrix(); matrix.postTranslate(-width / 2, -height / 2); matrix.postRotate(angle); matrix.postTranslate(width / 2, height / 2);
cela il faut travailler, ExifInterface ne fonctionne pas avec tous les fabrique donc utiliser CameraInfo au lieu de cela, il suffit de laisser la caméra de capture de l'image avec rotation par défaut, puis faites pivoter le résultat de données sur PictureCallback
Je n'ai pas la rep à laisser un commentaire, si je dois laisser une autre réponse au lieu de cela, bien que Nvhausid réponse est génial et mérite le crédit. Simple, élégant, et il fonctionne pour les deux caméras avant et arrière sur un appareil Samsung où Exif et les Médias Curseur ne fonctionne pas.
La seule chose que la réponse était manquante pour moi a été la manipulation de l'image miroir de la caméra en face de l'utilisateur.
Voici les changements au niveau du code pour que:
Et la nouvelle rotation de la méthode:
J'ai trouver la réponse forte pour vous, je viens de rencontrer le même problème et de le résoudre sans fichier de sauvegarde.La solution est d'enregistrer un OrientationEventListener pour obtenir l'orientation à chaque changement.http://www.androidzeitgeist.com/2013/01/fixing-rotation-camera-picture.html ici donner les détails.Mon code est comme ci-dessous:
espère que cela aide:)
C'est la meilleure méthode à utiliser (ci-Dessous) lors de votre mise en page est fixe en mode portrait.
Vous serez en utilisant OrientEventListener et de mettre en œuvre cet appel de retour de la méthode.
onOrientationChanged est appelé à chaque fois qu'il y a du changement dans l'orientation de votre rotation de la caméra sera mise en place et l'Image sera tourné quand vous sauvera.
getOutputMediaFile
Source Ici
J'ai utilisé la nouvelle caméra 2 api pour obtenir orientation du capteur et de la faire pivoter en conséquence:
Puis avec l'aide de cameraOrientation paramètre, j'ai fait tourner mon cameraPhoto: