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[]
copyPixelsToBuffer
바이트 호출 이 모두 0 인 후 버퍼를 보면 카메라에서 반환 된 비트 맵은 변경할 수 없지만 복사를 수행하기 때문에 중요하지 않습니다.
이 코드에 어떤 문제가있을 수 있습니까?
답변
다음과 같이 해보십시오 :
Bitmap bmp = intent.getExtras().get("data");
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bmp.compress(Bitmap.CompressFormat.PNG, 100, stream);
byte[] byteArray = stream.toByteArray();
bmp.recycle();
답변
CompressFormat이 너무 느립니다 …
ByteBuffer를 사용해보십시오.
※※※ 비트 맵을 바이트로 ※※※
width = bitmap.getWidth();
height = bitmap.getHeight();
int size = bitmap.getRowBytes() * bitmap.getHeight();
ByteBuffer byteBuffer = ByteBuffer.allocate(size);
bitmap.copyPixelsToBuffer(byteBuffer);
byteArray = byteBuffer.array();
※※※ 바이트에서 비트 맵으로 ※※※
Bitmap.Config configBmp = Bitmap.Config.valueOf(bitmap.getConfig().name());
Bitmap bitmap_tmp = Bitmap.createBitmap(width, height, configBmp);
ByteBuffer buffer = ByteBuffer.wrap(byteArray);
bitmap_tmp.copyPixelsFromBuffer(buffer);
답변
다음은 .convertToByteArray
Kotlin에서 작성된 비트 맵 확장 입니다.
/**
* Convert bitmap to byte array using ByteBuffer.
*/
fun Bitmap.convertToByteArray(): ByteArray {
//minimum number of bytes that can be used to store this bitmap's pixels
val size = this.byteCount
//allocate new instances which will hold bitmap
val buffer = ByteBuffer.allocate(size)
val bytes = ByteArray(size)
//copy the bitmap's pixels into the specified buffer
this.copyPixelsToBuffer(buffer)
//rewinds buffer (buffer position is set to zero and the mark is discarded)
buffer.rewind()
//transfer bytes from buffer into the given destination array
buffer.get(bytes)
//return bitmap's pixels
return bytes
}
답변
아마도 버퍼를 되 감아 야합니까?
또한 비트 맵의 보폭 (바이트)이 행 길이보다 픽셀 * 바이트 / 픽셀보다 큰 경우에 발생할 수 있습니다. 크기 대신 바이트 길이 b.remaining ()을 만드십시오.
답변
아래 함수를 사용하여 비트 맵을 byte []로 인코딩하거나 그 반대로
public static String encodeTobase64(Bitmap image) {
Bitmap immagex = image;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
immagex.compress(Bitmap.CompressFormat.PNG, 90, baos);
byte[] b = baos.toByteArray();
String imageEncoded = Base64.encodeToString(b, Base64.DEFAULT);
return imageEncoded;
}
public static Bitmap decodeBase64(String input) {
byte[] decodedByte = Base64.decode(input, 0);
return BitmapFactory.decodeByteArray(decodedByte, 0, decodedByte.length);
}
답변
바이트 배열이 너무 작습니다. 각 픽셀은 1이 아닌 4 바이트를 차지하므로 크기가 4보다 곱하여 배열이 충분히 큽니다.
답변
API 문서에서 Ted Hopp가 정확합니다.
public void copyPixelsToBuffer (Buffer dst)
“…이 메소드가 리턴되면 버퍼 의 현재 위치 가 업데이트됩니다. 위치는 버퍼에 기록 된 요소 수만큼 증가합니다.”
과
public ByteBuffer get (byte[] dst, int dstOffset, int byteCount)
” 지정된 오프셋에서 시작 하여 현재 위치 에서 지정된 바이트 배열로 바이트를 읽고 읽은 바이트 수만큼 위치를 증가시킵니다.”