Impossible de convertir un bitmap Java en tableau d'octets
L'extrait de code tente de convertir un bitmap Java en tableau d'octets pour un traitement ultérieur. Toutefois, une erreur inattendue se produit lors de la tentative de copie des pixels bitmap dans la mémoire tampon. Les données copiées renvoient systématiquement tous les zéros. Ce problème survient bien que le bitmap soit renvoyé par la caméra comme immuable.
Pour comprendre le problème sous-jacent, considérez ce qui suit :
bmp.copyPixelsToBuffer(b); byte[] bytes = new byte[size]; try { b.get(bytes, 0, bytes.length); } catch (BufferUnderflowException e) { // always happens }
La méthode copyPixelsToBuffer copie les données de pixels du bitmap dans le tampon fourni. Cependant, la taille de la mémoire tampon est incorrecte, ce qui entraîne une exception de dépassement insuffisant de la mémoire tampon. Pour résoudre ce problème, utilisez la taille du tampon renvoyée par b.limit() au lieu de size :
byte[] bytes = new byte[b.limit()];
De plus, la logique conditionnelle pour gérer l'exception de dépassement insuffisant du tampon n'est pas nécessaire. L'exception se produira quelle que soit la condition, car le tampon est toujours sous-dimensionné.
Approche alternative
Au lieu de la méthode problématique copyPixelsToBuffer, envisagez d'utiliser une approche alternative pour convertir le bitmap en un tableau d'octets :
Bitmap bmp = intent.getExtras().get("data"); ByteArrayOutputStream stream = new ByteArrayOutputStream(); bmp.compress(Bitmap.CompressFormat.PNG, 100, stream); byte[] byteArray = stream.toByteArray(); bmp.recycle();
Dans cette approche, le bitmap est compressé dans un tableau d'octets au format PNG. Cette méthode garantit une représentation valide du tableau d'octets du bitmap.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!