我不是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
}
但这很慢(比以前慢):(
请问,有人可以提供更快的方法吗?指导我......
答案 0 :(得分:1)
第一个解决方案是正确的。
但这里可能会发生两件事:
除此之外,如果它花了一些时间,我怀疑它可能会更快(成为正确的解决方案)。
答案 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格式。