2017-02-08 2 views
1

J'ai une application avec une fonction de caméra. J'utilise l'API Android Camera2. J'ai trouvé que certains appareils Android (par exemple Nexus 6P, Nexus 5) fonctionnent mieux si le ImageReader est configuré pour fournir: JPEGsComment choisir un type de tampon ImageReader pour mon application pour appareil photo Android?

imageReader = ImageReader.NewInstance(width, height, ImageFormatType.Jpeg, 2); 

Et certains appareils Android (Nexus 7 par exemple 2013) fonctionnent mieux si le ImageReader est configuré pour fournir, par exemple, RGBA_8888:

imageReader = ImageReader.NewInstance(width, height, (ImageFormatType)1 /* PixelFormat.RGBA_8888 */, 2); 

Le dispositif qui fonctionne mieux avec les fichiers JPEG recrache cette erreur si j'utilise RGBA_8888:

[ImageReader_JNI] Producer output buffer format: 0x22, ImageReader configured format: 0x1 

Le dispositif qui fonctionne mieux avec des tampons RGBA recrache cet avertissement si j'utilise les fichiers JPEG: (Il fonctionne toujours, mais il est assez lent que l'image capturée est sombre.)

[ImageReader_JNI] ImageReader_lockedImageSetup: Receiving JPEG in HAL_PIXEL_FORMAT_RGBA_8888 buffer. 

Je dois faire un peu de traitement sur ce que je récupère, donc en fin de compte ce serait mieux si je pouvais configurer la caméra pour cracher juste une sorte de bitmap plutôt qu'un JPEG, puisque je dois convertir le JPEG en Bitmap avant de continuer. Comment choisir le type de tampon à transmettre au ImageReader?

+0

Quelle est votre utilisation? Instantanés uniques (peu de captures par seconde) ou capture continue (~ 30fps)? –

+0

J'ai une surface de prévisualisation qui prend une capture continue jusqu'à ce que vous appuyiez sur le bouton Prendre une image, à quel point elle est capturée par le 'ImageReader'. –

Répondre

1

Les seuls formats garantis que tous les appareils photo doivent prendre en charge sont YUV_420_888 et JPEG; même à cela, les appareils de niveau LEGACY ne prennent généralement en charge JPEG qu'à une résolution maximale (et YUV_420_888 à des résolutions d'aperçu, généralement pas supérieures à 1080p). Vous devriez vérifier la liste des formats pris en charge dans le StreamConfigurationMap au lieu de simplement en essayer aveuglément - alors que certains appareils peuvent supporter des formats aléatoires ne figurant pas dans leur liste officielle, il n'y a pas beaucoup de garantie sur la façon dont ils vont le faire .

La capture JPEG a tendance à être plus lente car les périphériques de niveau LEGACY supposent que lorsque vous voulez un JPEG, vous voulez une qualité de capture maximale, ce qui nécessite davantage de post-traitement qu'un simple aperçu. De plus, les appareils LEGACY peuvent effectuer des mesures de flash et des tirs. Les appareils LIMITÉS ou de meilleure qualité vous permettent de contrôler la qualité du post-traitement, de sorte qu'il n'est pas lié au format de sortie et supporte généralement des résolutions plus élevées de capture YUV. Je resterais généralement loin de RGBA si vous voulez un large soutien - il fonctionne avec les périphériques LEGACY est un peu bizarre, et les appareils limités et mieux ne sont pas susceptibles de le supporter. Quand vous dites que le JPEG fonctionne, mais qu'il est assez lent pour que l'image capturée soit sombre, je suis un peu confus - pourquoi la lenteur signifie-t-elle une image sombre? Ou voulez-vous simplement dire que les images sont sombres?

+0

Sur la plupart de mes appareils, la capture au format JPEG est correcte. Mais sur celui-ci Nexus 7 2013, si je capture à YUV, la couleur est bonne, mais si je capture en JPEG, parfois il fait noir. Je pensais d'abord qu'il s'agissait d'arrêter la répétition de cadres de prévisualisation ou quelque chose, mais cela ne semble pas être le cas. –