Aller au contenu

SurfaceView Customisé pour previsualiser l'image de la camera


ErGo_404

Recommended Posts

Bonjour !

Je suis plus ou moins novice en dev Android, et je dois pour mon boulot récupérer l'image qui sort de la caméra.

Je voulais faire un SurfaceView customisé pour cela, ce qui me permet ensuite de l'incorporer facilement dans n'importe quelle application directement dans le XML.

J'ai donc récupérer des bouts de code venant du net (en soi, la gestion de la prévisualisation pour la caméra n'est il est vrai pas très compliquée), voici le code de ma SurfaceView :


import java.io.IOException;
import java.util.List;

import android.content.Context;
import android.content.res.Configuration;
import android.hardware.Camera;
import android.hardware.Camera.Size;
import android.util.AttributeSet;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class CameraPreviewSurfaceView extends SurfaceView implements SurfaceHolder.Callback{

   private SurfaceHolder surfaceHolderCamera;
   private Camera camera;


   public CameraPreviewSurfaceView(Context context) {
       super(context);
       surfaceHolderCamera = getHolder();
       surfaceHolderCamera.addCallback(this);
       surfaceHolderCamera.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
   }

   public CameraPreviewSurfaceView(Context context, AttributeSet attrs) {
       this(context);
   }

   public CameraPreviewSurfaceView(Context context, AttributeSet attrs,int defStyle) {
       this(context);
   }

   @Override
   public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
       Camera.Parameters parameters = camera.getParameters();
       List listeTailles = parameters.getSupportedPreviewSizes();
       Size proche = null;
       int largeurOpt = width;
       int largeurMax = 0;
       for(Size s : listeTailles) {
           if(s.width < largeurOpt && largeurOpt - s.width < largeurOpt - largeurMax ) {
               proche = s;
               largeurMax = s.width;
               parameters.setPreviewSize(proche.width, proche.height);
           }
       }    
       camera.setParameters(parameters);
       camera.startPreview();

   }

   @Override
   public void surfaceCreated(SurfaceHolder holder) {
       camera = Camera.open();
       try {
           camera.setPreviewDisplay(surfaceHolderCamera);
       } catch (IOException e) {
           camera.release();
           camera = null;
       }
   }

   @Override
   public void surfaceDestroyed(SurfaceHolder holder) {
       camera.stopPreview();
       camera = null;

   }
}

Voilà j'ai deux soucis.

Le premier, c'est que j'aimerais pouvoir spécifier dans mon XML la largeur de la surfaceview (en valeur absolue ou en relatif comme "fill_parent" et que celle ci s'adapte automatiquement en hauteur pour respecter le ratio de la caméra. Comme vous le voyez dans la méthode surfaceChanged() j'ai fait une tentative désespérée de récupérer la taille de l'image capturée pour l'adapter à la largeur de la surfaceview. A noter que si je supprime cette portion de code pour la remplacer par un simple parameters.setPreviewSize(width, height); je me prends une erreur dans la tronche comme quoi la taille demandée n'est pas supportée par la caméra.

Le résultat de cette méthode c'est que l'image prend effectivement la largeur de mon écran, mais prend également toute la hauteur disponible (au lieu de ne prendre que la hauteur correspondant au bon ratio), résultat l'image est étirée en hauteur.

Le deuxième résultat assez gênant est que l'image semble être inversée (je dirais tournée vers la gauche). J'ai vu sur internet que je n'étais pas le seul a avoir ce problème, mais je n'arrive pas à le régler, j'ai essayé de régler l'orientation avec parameters.setRotation() mais aucun des arguments que je passe à cette fonction ne fonctionne. A noter que j'ai forcé l'application en mode portrait, pour des raisons de simplicité et de cohérence dans mon UI.

Au final mes deux problèmes (étirement de l'image et inversion) font que mon image est tout simplement dégueulasse et elle donne une belle envie de vomir si on la regarde trop longtemps.

J'espère que quelqu'un a la solution à mon problème, je suis sûr de ne pas être le seul à être tombé dessus. Merci pour vos réponses.

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...