更快地将Bitmap转换为Byte []

时间:2014-04-23 09:57:15

标签: java android optimization bitmap

我不是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
}

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

请问,有人可以提供更快的方法吗?指导我......

3 个答案:

答案 0 :(得分:1)

第一个解决方案是正确的。

但这里可能会发生两件事:

  1. 图像可能不是JPEG类型,因此需要转换,这需要时间
  2. 图像压缩50%,这需要时间
  3. 除此之外,如果它花了一些时间,我怀疑它可能会更快(成为正确的解决方案)。

答案 1 :(得分:1)

你必须考虑这样一个事实:处理速度与你正在测试的设备的速度紧密相关(因为这是标记的android我假设你正在使用移动设备)。

你应该看看android开发人员如何有效地处理大位图Android developers。由于每秒处理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;
}

答案 2 :(得分:0)

你可以尝试如下

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格式。