2011-09-28 4 views
22

L'application que j'écris nécessite la fonctionnalité de la caméra. Donc, pour en apprendre davantage sur la façon d'utiliser l'appareil photo, j'ai suivi ce script:appareil photo android étiré en mode paysage

http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/CameraPreview.html

J'ai mis l'activité dans mon manifeste, définir l'orientation de l'écran pour sur le mode paysage. Le problème que j'ai, c'est que quand la caméra est tenue sur le côté (donc je tiens ma Galaxy Tab P1000 en position paysage), la vue est allongée. Pour être plus précis sur mon script, j'ai utilisé une copie exacte du code que Google a créé. Il peut être trouvé dans le android-sdk \ samples \ android-8 \ ApiDemos \ src \ com \ exemple \ android \ apis \ graphics \

Le fichier lui-même s'appelle CameraPreview. Je n'ai aucune idée de la raison pour laquelle l'écran semble si tendu. Bien sûr, le format est bizarre et pas carré, mais quand même, en utilisant l'application de caméra par défaut installée sur l'appareil, il ne se déforme pas du tout. Cette caméra déforme l'image quand je la tiens de côté et bouge légèrement la caméra.

enter image description here

enter image description here

Ce que je ne faisais: je tenais mon galaxy tab pour prendre une photo d'un objet (ordinateur portable dans ce cas), puis a pris une photo avec mon téléphone de mon Galaxy. Sur le Galaxy j'ai l'écran de l'appareil photo ouvert dans l'application que je fais. Cela compte pour les deux images. Un que je tiens de côté et un que je tiens en vue de portrait. Les photos sont un peu floues mais vous pouvez voir que dans la photo de paysage, la caméra est devenue massivement large.

+3

T_T Alors, suis-je le seul au monde à avoir ce problème? <: –

+0

Je rencontre ce problème aussi ... – Saty

+0

Cette question est une gemme cachée!J'ai eu du mal à chercher ça. Ayant utilisé tous les mots-clés dans google. Cette question m'a sauvé la vie. –

Répondre

21

J'ai fait face au même problème hier. Après une recherche de sources "Camera", j'ai trouvé une raison pour que l'aperçu de la caméra soit étiré. La raison est la suivante: Le rapport d'aspect SurfaceView (largeur/hauteur) DOIT être le même que Camera.Size ratio d'aspect utilisé dans les paramètres de prévisualisation. Et si le format n'est pas le même, vous avez une image étirée. Par conséquent, la solution de contournement la plus rapide consiste à définir SurfaceView à la taille de 320px x 240px - la plus petite taille prise en charge dans Parameters.getSupportedPreviewSizes().

Vous pouvez également regarder les sources d'application standard de la caméra, elle utilise la disposition personnalisée pour contrôler la taille de SurfaceView (voir la fonction PreviewFrameLayout.java, onMeasure()).

Utilisez

clone git https://android.googlesource.com/platform/packages/apps/Camera.git

pour obtenir des sources de l'appareil photo.

+1

+1 pour décrire le problème réel. Vous pouvez trouver la hauteur et la largeur de SurfaceView dans surfaceChanged, puis utiliser getSupportedPreviewSizes sur l'objet Paramètres de la caméra pour trouver la correspondance la plus proche et définir SurfaceView à la taille acceptable requise. –

+0

je fais comme ça, mais ne marche pas. private Camera.Size getBestPreviewSize (largeur int, hauteur int, paramètres Camera.Parameters) { \t Camera.Size result = null; \t pour (taille de Camera.Size: parameters.getSupportedPreviewSizes()) { \t \t if (size.width <= largeur && size.height <= hauteur) { \t \t \t if (résultat == NULL) { \t \t \t \t résultat = taille; \t \t \t} \t \t \t else { \t \t \t \t int resultArea = result.width * result.height; \t \t \t \t int nouveauArea = size.width * size.height; \t \t \t \t if (newArea> resultArea) { result = \t taille \t \t \t \t; \t \t \t \t} \t \t \t} \t \t} \t} return (résultat); } – gIrL

+1

Votre code recherche uniquement la plus grande taille d'aperçu qui correspond à la largeur et à la hauteur initiales. Bien sûr, vous avez des problèmes avec l'écran étiré, parce que le plus grand ne signifie pas "meilleur rapport d'aspect". En ajustant sa largeur ou sa hauteur, vous devez ajuster votre taille de prévisualisation à cette "plus grande" taille, ce ratio = largeur/hauteur sera le même pour les valeurs initiales (largeur, hauteur) et pour les valeurs finales (result.width, result.height) – Lord

7
public void surfaceCreated(SurfaceHolder holder) { 
     // TODO Auto-generated method stub 

     try { 
      camera = Camera.open(); 

      camera.setDisplayOrientation(90); 
      camera.setPreviewDisplay(holder); 
      Camera.Parameters parameters = camera.getParameters(); 
      List<Size> sizes = parameters.getSupportedPictureSizes(); 
      parameters.setPictureSize(sizes.get(0).width, sizes.get(0).height); // mac dinh solution 0 
      parameters.set("orientation","portrait"); 
      //parameters.setPreviewSize(viewWidth, viewHeight); 
      List<Size> size = parameters.getSupportedPreviewSizes(); 
      parameters.setPreviewSize(size.get(0).width, size.get(0).height); 
      camera.setParameters(parameters); 
      camera.startPreview(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

Vous devez seulement getSupportedPreviewSizes() et enregistrer dans un List:

List<Size> size = parameters.getSupportedPreviewSizes(); 
      parameters.setPreviewSize(size.get(0).width, size.get(0).height); 
      camera.setParameters(parameters); 



camera.startPreview(); 

J'espère que cela vous aide.