【问题标题】:Faster way for Bitmap to Byte[] coversion位图到字节 [] 转换的更快方法
【发布时间】:2014-06-08 02:02:12
【问题描述】:

我不是位图新手,也不是 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
}

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

拜托,谁能给个更快的方法?引导我...

【问题讨论】:

  • 这个问题不是任何其他问题的副本。它与优化和寻找最佳技术有关。而且我做了很好的研究。
  • 您好,您能分享一下您的发现吗?到目前为止,您分析的哪个更快。
  • @vrs 第一种方法更好。我刚刚发现你压缩得越多,花费的时间就越多。但与后者相比,后者肯定需要更多时间。

标签: java android optimization bitmap


【解决方案1】:

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

你应该看看 android 开发者如何有效地处理大位图 Android developers 。由于每秒处理 5 张高分辨率图像对你来说很慢,我可以假设你有某种画廊或预览?如果是这种情况,您不应该处理高分辨率图像,并且确实应该查看上面的链接。

另外作为旁注,您的第二个代码可以通过这种方式进行优化:

int bytes = bmp.getByteCount();
ByteBuffer buffer = ByteBuffer.allocate(bytes);
bmp.copyPixelsToBuffer(buffer);
byte[] array = buffer.array();

据我所知,最有效的复制字节的方法是 copy(),取自 Commons-IO:

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;
}

【讨论】:

  • 我尝试了你提到的第一种方法。没有帮助,因为这种方法比我现在使用的方法慢 10 倍(压缩技术)。但我会再次浏览链接。谢谢。
【解决方案2】:

你可以尝试如下

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

【讨论】:

    【解决方案3】:

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

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

    1. 图像可能不是 JPEG 类型,因此会发生转换,这需要时间
    2. 图片压缩50%,需要时间

    除此之外,如果需要一些时间,我怀疑它会更快(作为正确的解决方案)。

    【讨论】:

    • 我通过调用 ll.draw(Canvas) 方法从线性布局制作位图。哪种压缩最适合?
    • +1 指导我,但我需要更多关于这个主题的帮助。自过去 2 天以来,我一无所知,并且确实搜索了很多。
    • 如果内存不是问题,您可以在处理图像时尝试不压缩,这将显着加快并在保存到磁盘或 SD 时进行压缩。但是如果您有很多图像,这可能会影响UI 的性能以及最终的设备性能。
    • @sokie 恰到好处。你可以少做一些来加快这个过程,但无论如何处理和编写都需要一些时间。
    猜你喜欢
    • 1970-01-01
    • 2011-05-18
    • 2013-06-25
    • 1970-01-01
    • 1970-01-01
    • 2014-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多