web-dev-qa-db-fra.com

Comment convertir Android.media.Image en objet bitmap?

Dans Android, je reçois un objet Image d'ici https://inducesmile.com/Android/android-camera2-api-example-tutorial/ ce tutoriel de caméra. Mais je veux maintenant parcourir les valeurs en pixels, est-ce que quelqu'un sait comment je peux le faire? Dois-je le convertir en autre chose et comment puis-je le faire?

Merci

17
omega

Si vous voulez boucler tout au long du pixel, vous devez d'abord le convertir en objet Bitmap. Maintenant que ce que je vois dans le code source renvoie un Image, vous pouvez directement convertir les octets en bitmap.

    Image image = reader.acquireLatestImage();
    ByteBuffer buffer = image.getPlanes()[0].getBuffer();
    byte[] bytes = new byte[buffer.capacity()];
    buffer.get(bytes);
    Bitmap bitmapImage = BitmapFactory.decodeByteArray(bytes, 0, bytes.length, null);

Ensuite, une fois que vous obtenez l'objet bitmap, vous pouvez maintenant parcourir tous les pixels.

15
Rod_Algonquin

https://docs.Oracle.com/javase/1.5.0/docs/api/Java/nio/ByteBuffer.html#get%28byte []% 29

Selon les documents Java: la méthode buffer.get transfère les octets de ce tampon dans le tableau de destination donné. Une invocation de cette méthode sous la forme src.get (a) se comporte exactement de la même manière. comme l'invocation

 src.get(a, 0, a.length) 
0
Tawanda Matereke

En fait, vous avez deux questions en une 1) Comment faites-vous pour lancer des pixels Android.media.Image en boucle 2) Comment convertir Android.media.image en Bitmap

Le 1 er est facile. Notez que l'objet Image que vous obtenez de la caméra, c'est juste un cadre YUV, où les composants Y et U + V sont dans des plans différents. Dans de nombreux cas de traitement d'image, vous n'avez besoin que du plan Y, c'est-à-dire de la partie grise de l'image. Pour l'obtenir, je suggère un code comme celui-ci:

    Image.Plane[] planes = image.getPlanes();
    int yRowStride = planes[0].getRowStride();
    byte[] yImage = new byte[yRowStride];
    planes[0].getBuffer().get(yImage);

Le tampon d'octets yImage est en fait les pixels gris du cadre. De la même manière, vous pouvez obtenir les pièces U + V. Notez qu'ils peuvent être U en premier, et V après, ou V et ensuite U, et peut-être entrelacés (c'est le cas le plus courant avec l'API Camera2). Vous obtenez donc UVUV ....

À des fins de débogage, j'écris souvent le cadre dans un fichier et j'essaye de l'ouvrir avec l'application Vooya (Linux) pour vérifier le format.

La deuxième question est un peu plus complexe. Pour obtenir un objet Bitmap, j'ai trouvé un exemple de code du projet TensorFlow ici . La fonction la plus intéressante pour vous est "convertImageToBitmap" qui vous renverra des valeurs RVB.

Pour les convertir en un véritable bitmap, procédez comme suit:

  Bitmap rgbFrameBitmap;
  int[] cachedRgbBytes;
  cachedRgbBytes = ImageUtils.convertImageToBitmap(image, cachedRgbBytes, cachedYuvBytes);
  rgbFrameBitmap = Bitmap.createBitmap(image.getWidth(), image.getHeight(), Bitmap.Config.ARGB_8888);
  rgbFrameBitmap.setPixels(cachedRgbBytes,0,image.getWidth(), 0, 0,image.getWidth(), image.getHeight());

Remarque: il existe plus d'options de conversion des images YUV en images RVB, donc si vous avez besoin de la valeur en pixels, peut-être que Bitmap n'est pas le meilleur choix, car il peut consommer plus de mémoire que vous n'en avez besoin, pour obtenir simplement les valeurs RVB

0
Arkady