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
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.
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é)
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.