Appareil photo Android face frontale prenant des photos inversées

J'ai cette application qui fonctionne en mode portrait et, en tant que partie d'une activité, j'ai un objet caméra en cours d'exécution en tant que fragment.

J'ai l'option de passer de l'appareil photo avant à arrière et lorsque vous prenez des photos avec la caméra arrière, tout va bien et bien.

  • Passer d'une activité à la suivante dans Android
  • Définition du titre d'action personnalisé du fragment
  • Est-ce que quelqu'un sait comment utiliser PagerTitleStrip dans Android?
  • Google GCM, token vs id d'enregistrement
  • SVN et mise en surbrillance de syntaxe sur Android
  • ANDROID: divisez l'écran en 2 parties égales avec 2 listes
  • Cependant, lorsque je prends des photos avec la caméra avant, elles s'inversent à 180 degrés. Maintenant, je sais que c'est probablement quelque chose à voir avec l'orientation en mode portrait, mais l'avoir dans le paysage suffit de tuer l'idée de mon application.

    Est-ce que, de toute façon, cela peut-il être corrigé, de sorte que la photo prise est la même que celle que vous voyez dans l'aperçu?

    listener = new OrientationEventListener(this.getActivity(),SensorManager.SENSOR_DELAY_NORMAL){ @Override public void onOrientationChanged(int orientation) { // TODO Auto-generated method stub if (orientation == ORIENTATION_UNKNOWN) return; android.hardware.Camera.CameraInfo info = new android.hardware.Camera.CameraInfo(); android.hardware.Camera.getCameraInfo(mCurrentCamera, info); orientation = (orientation + 45) / 90 * 90; int rotation = 0; if (info.facing == CameraInfo.CAMERA_FACING_FRONT) { rotation = (info.orientation - orientation + 360) % 360; } else { // back-facing camera rotation = (info.orientation + orientation) % 360; } if (mCamera.getParameters() != null){ Camera.Parameters mParameters = mCamera.getParameters(); mParameters.setRotation(rotation); mCamera.setParameters(mParameters); } } }; listener.enable(); if (listener.canDetectOrientation()) Log.d("Orientation Possible", "Orientation Possible"); 

    Le problème est que, après avoir essayé de prendre une photo, cette chose se bloque. En outre, si cela fonctionne pendant un certain temps juste en mode prévisualisation, il se bloque à nouveau. Je devrais probablement ajouter, que dans une autre méthode, je le fais.

      public void switchCamera(Camera camera) { setCamera(camera); try { camera.setPreviewDisplay(mHolder); } catch (IOException exception) { Log.e(TAG, "IOException caused by setPreviewDisplay()", exception); } Camera.Parameters parameters = camera.getParameters(); parameters.setPreviewSize(mPreviewSize.width, mPreviewSize.height); requestLayout(); try{ camera.setParameters(parameters); } catch (RuntimeException ex){ Log.d("Preview", "Failure to set proper parameters"); //need to improve this method if (mSupportedPreviewSizes != null) { Camera.Size cs = mSupportedPreviewSizes.get(0); parameters.setPreviewSize(cs.width, cs.height); camera.setParameters(parameters); requestLayout(); //int tempheight = mPreviewSize.height; //mPreviewSize.height = mPreviewSize.width; //mPreviewSize.width = tempheight; } } 

    C'est ce que l'on appelle lorsque vous basculez entre les caméras (face vers l'avant face vers l'arrière). Cela pourrait-il interférer avec l'auditeur d'événements d'orientation?

    De plus, lors de la sauvegarde de l'image prise, c'est ce que j'appelle. Avant de saisir les données en tant que paramètre, mais j'ai essayé de faire en sorte que l'orientation de l'écran soit aussi correcte. Le problème est que l'orientation de l'écran est toujours de 90, peu importe quoi. Ainsi, le bitmap sera toujours tourné de 90 degrés (ce qui est idéal pour prendre des photos avec la caméra arrière) mais l'inverse lorsque vous l'emmenez avec la caméra avant. Une solution pourrait-elle être implémentée dans cette fonction?

      public static Bitmap MakeSquare(byte[] data, int orientation) { int width; int height; // Rotate photo Matrix matrix = new Matrix(); matrix.postRotate(orientation); // Convert ByteArray to Bitmap Bitmap bitPic = BitmapFactory.decodeByteArray(data, 0, data.length); width = bitPic.getWidth(); height = bitPic.getHeight(); // Create new Bitmap out of the old one Bitmap bitPicFinal = Bitmap.createBitmap(bitPic, 0, 0, width, height,matrix, true); bitPic.recycle(); int desWidth; int desHeight; desWidth = bitPicFinal.getWidth(); desHeight = desWidth; Bitmap croppedBitmap = Bitmap.createBitmap(bitPicFinal, 0,bitPicFinal.getHeight() / 2 - bitPicFinal.getWidth() / 2,desWidth, desHeight); croppedBitmap = Bitmap.createScaledBitmap(croppedBitmap, 528, 528, true); return croppedBitmap; } 

  • "Pas assez d'informations pour inférer le paramètre T" avec Kotlin et Android
  • Détecter le périphérique pour le débogage (ADB) ne fonctionne pas
  • RegisterMediaButtonEventReceiver / traitement des boutons de volume
  • Ajout d'une vue au bas de la mise en page dans une vue de défilement
  • Comment résoudre "Cet élément n'a pas de source attachée et le Javadoc n'a pas pu être trouvé dans le Javadoc attaché"?
  • Le service exporté ne nécessite pas d'autorisation: qu'est-ce que cela signifie?
  • 2 Solutions collect form web for “Appareil photo Android face frontale prenant des photos inversées”

    Bien bien. Il me semble que je me suis bien occupé de ça. J'ai utilisé les conseils de ceci: Android, caméra avant et arrière Orientation, Paysage

    Et j'ai changé ma fonction MakeSquare à ceci:

     public static Bitmap MakeSquare(byte[] data, int cameraID) { int width; int height; Matrix matrix = new Matrix(); Camera.CameraInfo info = new Camera.CameraInfo(); android.hardware.Camera.getCameraInfo(cameraID, info); // Convert ByteArray to Bitmap Bitmap bitPic = BitmapFactory.decodeByteArray(data, 0, data.length); width = bitPic.getWidth(); height = bitPic.getHeight(); // Perform matrix rotations/mirrors depending on camera that took the photo if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) { float[] mirrorY = { -1, 0, 0, 0, 1, 0, 0, 0, 1}; Matrix matrixMirrorY = new Matrix(); matrixMirrorY.setValues(mirrorY); matrix.postConcat(matrixMirrorY); } matrix.postRotate(90); // Create new Bitmap out of the old one Bitmap bitPicFinal = Bitmap.createBitmap(bitPic, 0, 0, width, height,matrix, true); bitPic.recycle(); int desWidth; int desHeight; desWidth = bitPicFinal.getWidth(); desHeight = desWidth; Bitmap croppedBitmap = Bitmap.createBitmap(bitPicFinal, 0,bitPicFinal.getHeight() / 2 - bitPicFinal.getWidth() / 2,desWidth, desHeight); croppedBitmap = Bitmap.createScaledBitmap(croppedBitmap, 528, 528, true); return croppedBitmap; } 

    Cela semble fonctionner et faire l'affaire. Même si je ne suis pas sûr que ce soit la meilleure façon, je suis content de cela. Maintenant, tout ce que je dois faire, c'est comprendre pourquoi il ne prend pas le bon rapport d'aspect lors de l'utilisation de la caméra avant.

    Donnez-leur un essai:

    http://developer.android.com/reference/android/hardware/Camera.html#setDisplayOrientation(int )

    http://developer.android.com/reference/android/hardware/Camera.Parameters.html#setRotation(int )

    Plus précisément, voici un morceau de verbiage à partir du lien setRotation.

    "Si les applications souhaitent faire pivoter l'image pour correspondre à l'orientation de ce que les utilisateurs voient, les applications devraient utiliser OrientationEventListener et Camera.CameraInfo. La valeur de OrientationEventListener est relative à l'orientation naturelle de l'appareil. L'orientation CameraInfo est l'angle entre l'orientation de la caméra et L'écart entre les deux est l'angle de rotation de l'appareil photo tourné vers l'avant . Notez que les images JPEG des caméras orientées vers l'avant ne sont pas reflétées comme dans l'aperçu afficher."

    J'ai utilisé ce code tel quel, ne l'ai pas modifié. Ma caméra est mieux maintenant, elle a encore besoin de TLC. Je n'ai pas encore de fonctionnalité frontale.

    Bonne chance!

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.