Java 位图到字节[]转换的更快方法

Java 位图到字节[]转换的更快方法,java,android,optimization,bitmap,Java,Android,Optimization,Bitmap,我对位图并不陌生,对java也不陌生。我正在尝试将高分辨率位图转换为循环中的字节数组。请在此处查找代码: ByteArrayOutputStream stream = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.JPEG, 50, stream); imageByteArray = stream.toByteArray(); 当我使用上述方法时,我可以在1秒内转换5幅图像。但我需要更快。我尝试了ByteB

我对位图并不陌生,对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
}
但这非常缓慢(比以前慢):(


请问,有谁能给出一个更快的方法吗?请告诉我…

第一个解决方案是正确的

但这里可能发生两件事:

  • 图像可能不是JPEG类型,因此会发生转换,这需要时间
  • 图像压缩50%,这需要时间
  • 除此之外,如果这需要一些时间,我怀疑它是否能更快(这是正确的解决方案)。

    您可以尝试以下方法

    Bitmap bitmap = intent.getExtras().get("data");
    ByteArrayOutputStream stream = new ByteArrayOutputStream();
    bitmap .compress(Bitmap.CompressFormat.JPEG, 100, stream);
    byte[] byteArray = stream.toByteArray();
    
    希望它能对你有好处


    检查行位图。压缩(Bitmap.CompressFormat.JPEG,50,流);它可能导致问题。因为你使用的是JPEG格式,速率为50。

    < P>你必须考虑这样一个事实:处理的速度与你正在测试的设备的速度紧密相关(因为这被标记为Android,我假设你在使用移动设备)。 你应该看看android developer如何有效地处理大型位图。由于每秒处理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;
    }
    

    我通过调用ll.draw(Canvas)从线性布局制作位图方法。哪种压缩方式最适合?+1用于指导我,但我需要更多关于这个主题的帮助。我从过去两天以来就没有任何线索,而且真的搜索了很多。如果内存不是问题,您可以尝试在处理图像时不压缩,这将大大加快速度,并在保存到磁盘或SD时压缩。但是如果您有大量图像这可能会影响用户界面的性能,并最终影响设备的性能。@sokie说得很对。你可以少做一些事情来加快进程,但无论如何,处理和编写都需要一些时间。这个问题不是任何其他问题的副本。它与优化和找到最佳技术有关。我做了一个相当不错的尝试很好的研究。嘿,你能分享你的发现吗?到目前为止,你分析的哪一种方法更快。@vrs第一种方法更好。我刚刚发现,你压缩的越多,所需的时间就越多。但与之相比,后一种方法肯定要花更多的时间。我尝试了你提到的第一种方法。没有帮助,因为这种方法比我使用的方法慢10倍现在是ng(竞争技巧)。但我会再次浏览链接。谢谢。