web-dev-qa-db-fra.com

Appareil photo sous Android, comment obtenir la meilleure taille, la taille de l'aperçu, la taille de l'image, la taille de la vue, l'image déformée

ayant une image déformée lors du mélange d'une vue d'OpenGL et de la caméra Android pour obtenir une image des deux lors de l'utilisation de la méthode de prise de vue. J'ai vérifié et constaté que l'image de la caméra était réglée sur 640X480 et la vue openGL et la prévisualisation de la caméra était réglée sur 1280x720.

j'ai donc réglé la taille de l'image de la caméra sur 1280x720 et le résultat était parfait. Cependant, je ne peux pas définir la taille dans le code car chaque appareil Android sera différent et pour chaque appareil, les paramètres de taille d'aperçu et de taille d'image doivent être sélectionnés dans une liste de tailles prises en charge.

quelle est la meilleure façon de le faire étant donné qu'il y a trois variables ici, la taille d'écran de la disposition d'activité, la taille d'aperçu de la caméra et la taille de l'image.

est-il préférable d'utiliser un match_parent ou fitXY pour la taille FrameLayout et de ne travailler qu'avec deux variables, la taille d'aperçu et la taille de l'image?

notez que plusieurs des combinaisons de largeur et de hauteur dans les tailles d'aperçu et les tailles d'image sont identiques. par exemple 1280 x 720 existe à la fois dans l'aperçu et l'image, est-il toujours vrai qu'il y aura des correspondances dans les deux tailles?

 List<Size> previewSizes = mCamera.getParameters().getSupportedPreviewSizes();

 List<Size> imageSizes = mCamera.getParameters().getSupportedPictureSizes();

 // layout in the activity that the cameraView will placed in
 int layoutWidth = frameLayout.getWidth();
 int layoutHeight = frameLayout.getHeight();

par exemple dans une Android après la mesure, ce sont les résultats pour les 3 variables utilisées

taille de la vue de la mise en page Groupe en activité à la suite de la mesure

 1280 x 736

tailles d'image prises en charge

 320 x 240
 640 x 480
 1024 x 768
 1280 x 720 << best size in my example to use
 1280 x 768
 1280 x 920
 1600 x 1200
 2048 x 1536
 2560 x 1440
 2560 x 1536
 2560 x 1920  << native resolution of hardware camera

tailles d'aperçu prises en charge

 176 x 144
 320 x 240
 352 x 288
 480 x 320
 480 x 368
 640 x 480
 800 x 480
 800 x 600
 864 x 480
 864 x 576
 960 x 540
 1280 x 720 << best size in my example to use
 1280 x 768
 1280 x 960
18
Kevik

Le plus souvent, mais pas toujours, il existe une correspondance entre les proportions de l'image et les proportions de l'aperçu. Vous pouvez être assuré qu'au moins certains d'entre eux sont des rapports 4: 3 classiques (par exemple 640x480). La prise en charge de 16: 9 est également largement disponible.

L'écran peut avoir des proportions différentes. Pour le remplir correctement avec une image de caméra, il est largement accepté d'ajouter des marges noires (la même approche est utilisée sur YouTube). Alternativement, vous pouvez recadrer l'image de la caméra pour remplir tout l'écran.

Notez que la taille de l'écran (comme indiqué dans les spécifications techniques pour la variété d'appareils) n'est pas toujours réellement disponible pour l'affichage de votre image. Par exemple, les menus du système, la barre de titre, etc. peuvent prendre leur part de l'écran immobilier. Le mode immersif est disponible sur certains appareils et son comportement dépend de la version du système. Vous pouvez vous attendre à ce que les développements futurs d'Android, par exemple le support du second écran rendra le jeu encore plus intéressant .

Donc, les réponses à vos questions spécifiques:

est-il préférable d'utiliser un match_parent ou fitXY pour la taille FrameLayout et de ne travailler qu'avec deux variables, la taille d'aperçu et la taille de l'image? - non.

est-ce toujours le cas qu'il y aura des correspondances dans les deux tailles? - oui, mais peut-être que cette taille n'est pas optimale.

Même si votre appareil photo prend en charge différentes tailles d’image "larges", 1280x720 aperçu et 2560x1440 l'image peut être la meilleure correspondance, à la fois précisément à 16:9. Habituellement, la qualité de l'image à petite taille n'est pas significativement meilleure que l'aperçu à cette même taille, vous pouvez donc choisir d'enregistrer le cadre d'aperçu si 1280x720 Est ce dont vous avez vraiment besoin.

Si vous pouvez renoncer à takePicture(), votre application sera beaucoup plus réactive.

14
Alex Cohn

Algorithme possible:

1) Obtenez le rapport hauteur/largeur de la zone de sortie (= largeur/hauteur)

2) parcourez les tailles prises en charge:

Choisissez la plus grande avec un rapport d'aspect proche (+ - 5%, par exemple) Si rien n'est proche ou une résolution trop faible - faites simplement votre surface (sur laquelle vous dessinez des cadres) être le même rapport d'aspect que la plus grande taille prise en charge et centrez-la dans la vue parent

Cependant, il existe des tailles d'aperçu et des tailles d'image. Si vous souhaitez qu'ils aient le même rapport d'aspect - alors le meilleur choix est d'utiliser le rapport d'aspect de la taille d'image sélectionnée dans 1) De cette façon, vous devrez probablement centrer votre surface dans la vue parent

J'espère que ça t'as aidé)

1
Sam

Je pense que la meilleure façon d'obtenir preview size, picture size est que l'appareil photo a été configuré pour prendre en charge tous les appareils Android. Cela signifie que le preview size, picture size que vous décidez de configurer est approprié avec le format populaire pris en charge par tous les appareils, par ex. est 1280x720 etc.

Comme dans les codes suivants, est l'ex. ce que j'ai utilisé.

// start preview with new settings
    try {
        // set preview size and make any resize, rotate or
        // reformatting changes here
        Camera.Parameters parameters = mCamera.getParameters();

        for (Camera.Size size : parameters.getSupportedPictureSizes()) {
            // 640 480
            // 960 720
            // 1024 768
            // 1280 720
            // 1600 1200
            // 2560 1920
            // 3264 2448
            // 2048 1536
            // 3264 1836
            // 2048 1152
            // 3264 2176
            if (1600 <= size.width & size.width <= 1920) {
                parameters.setPreviewSize(size.width, size.height);
                parameters.setPictureSize(size.width, size.height);
                break;
            }
        }
        // Set parameters for camera
        CustomCamera.mCamera.setParameters(parameters);

        Camera.Size size = CustomCamera.mCamera.getParameters().getPictureSize();

        mCamera.setPreviewDisplay(mHolder);
        mCamera.startPreview();
    } catch (Exception e) {
        e.printStackTrace();
    }

Best size dépend de Camera MP. Je pense donc que devrait utiliser par défaut si vous utilisez l'appareil photo.

1
Huy Tower