[英]Faster way for Bitmap to Byte[] coversion
我不是bitmaps的新手,也不是java的新手。 我試圖在循環中將高分辨率位圖轉換為字節數組。 請在此處找到代碼:
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 50, stream);
imageByteArray = stream.toByteArray();
當我使用上述方法時,我可以在1秒內轉換5張圖像。 但我需要它更快。 我試過ByteBuffer
方法也是這樣的:
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
}
但這很慢(比以前慢):(
請問,有人可以提供更快的方法嗎? 引導我...
第一個解決方案是正確的解決方案。
但這里可能發生兩件事:
除此之外,如果需要一些時間,我懷疑它可能會更快(成為正確的解決方案)。
您必須考慮這樣一個事實:處理速度與您正在測試的設備的速度緊密相關(因為這是標記的android我假設您正在使用移動設備)。
你應該看看Android開發人員如何有效地處理Android開發人員的大位圖。 由於每秒處理5張高分辨率圖像對你來說很慢,我可以假設你有某種畫廊或預覽? 如果是這種情況,您不應該處理高分辨率圖像,並且應該看看上面的鏈接。
另外,作為旁注,您可以通過以下方式優化第二個代碼:
int bytes = bmp.getByteCount();
ByteBuffer buffer = ByteBuffer.allocate(bytes);
bmp.copyPixelsToBuffer(buffer);
byte[] array = buffer.array();
否則,我知道的復制字節的最有效方法是從Commons-IO獲取copy() :
public static int copy(InputStream input, OutputStream output) throws IOException {
int n, count = 0;
byte[] buffer = new byte[4 * 1024];
while (-1 != (n = input.read(buffer))) {
output.write(buffer, 0, n);
count += n;
}
return count;
}
你可以嘗試如下
Bitmap bitmap = intent.getExtras().get("data");
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bitmap .compress(Bitmap.CompressFormat.JPEG, 100, stream);
byte[] byteArray = stream.toByteArray();
希望它對你有用!!
檢查行bitmap.compress(Bitmap.CompressFormat.JPEG,50,stream); 它可能會導致問題..因為您使用速率為50的JPEG格式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.