簡體   English   中英

Bitmap to Byte [] coversion的更快方法

[英]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
}

但這很慢(比以前慢):(

請問,有人可以提供更快的方法嗎? 引導我...

第一個解決方案是正確的解決方案。

但這里可能發生兩件事:

  1. 圖像可能不是JPEG類型,因此發生轉換,這需要時間
  2. 圖像壓縮50%,這需要時間

除此之外,如果需要一些時間,我懷疑它可能會更快(成為正確的解決方案)。

您必須考慮這樣一個事實:處理速度與您正在測試的設備的速度緊密相關(因為這是標記的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM