Bitmap bmp = intent.getExtras().get("data");
int size = bmp.getRowBytes() * bmp.getHeight();
ByteBuffer b = ByteBuffer.allocate(size);
bmp.copyPixelsToBuffer(b);
byte[] bytes = new byte[size];
try {
b.get(bytes, 0, bytes.length);
} catch (BufferUnderflowException e) {
// always happens
}
// do something with byte[]
Quand je regarde le tampon après que l'appel aux copyPixelsToBuffer
octets soit tous à 0 ... Le bitmap renvoyé par la caméra est immuable ... mais cela n'a pas d'importance car il fait une copie.
Quel pourrait être le problème avec ce code?
java
android
serialization
bitmap
bytebuffer
Tom Fobear
la source
la source
ByteArrayOutputStream
allouerez unebyte[]
taille égale à celle debyte[]
votre supportBitmap
, puis vousByteArrayOutputStream.toByteArray()
en allouerez encore une autrebyte[]
de la même taille.CompressFormat est trop lent ...
Essayez ByteBuffer.
※※※ Bitmap en octets ※※※
※※※ octet en bitmap ※※※
la source
Bitmap bmp = BitmapFactory.decodeByteArray(bytes, 0, bytes.length)
oùbytes
est votre tableau d'octetsVoici l'extension bitmap
.convertToByteArray
écrite dans Kotlin.la source
Avez-vous besoin de rembobiner le tampon, peut-être?
Cela peut également se produire si la foulée (en octets) du bitmap est supérieure à la longueur de ligne en pixels * octets / pixel. Faites la longueur des octets b.remaining () au lieu de la taille.
la source
rewind()
C'est la clé. J'obtenais la même choseBufferUnderflowException
et rembobiner le tampon après l'avoir rempli a résolu ce problème.Utilisez les fonctions ci-dessous pour coder le bitmap en octet [] et vice versa
la source
Votre tableau d'octets est trop petit. Chaque pixel occupe 4 octets, pas seulement 1, donc multipliez votre taille * 4 pour que le tableau soit suffisamment grand.
la source
getRowBytes()
prend en compte les 4 octets par pixel.Ted Hopp est correct, à partir de la documentation de l'API:
"... Après le retour de cette méthode, la position actuelle du tampon est mise à jour: la position est incrémentée du nombre d'éléments écrits dans le tampon."
et
"Lit les octets de la position actuelle dans le tableau d'octets spécifié, en commençant à l'offset spécifié, et augmente la position du nombre d'octets lus."
la source
Afin d'éviter les
OutOfMemory
erreurs pour les fichiers plus gros, je résoudrais la tâche en divisant un bitmap en plusieurs parties et en fusionnant les octets de leurs parties.la source
Essayez ceci pour convertir String-Bitmap ou Bitmap-String
la source