我正在尝试将从资源获取的图像转换为ByteArray 稍后将通过Socket发送。我一直在测量每次转换的时间。
我已经在Flutter和原生Android(Kotlin)上做到了。所有测试均在大约1-2MB的同一图像上完成。
颤振代码:
sendMessage() async {
if (socket != null) {
Stopwatch start = Stopwatch()..start();
final imageBytes = await rootBundle.load('assets/images/stars.jpg');
final image = base64Encode(imageBytes.buffer.asUint8List(imageBytes.offsetInBytes, imageBytes.lengthInBytes));
print('Converting took ${start.elapsedMilliseconds}');
socket.emit("message", [image]);
}
}
科特琳代码:
private fun sendMessage() {
var message = ""
val thread = Thread(Runnable {
val start = SystemClock.elapsedRealtime()
val bitmap = BitmapFactory.decodeResource(resources, R.drawable.stars)
message = Base64.encodeToString(getBytesFromBitmap(bitmap), Base64.DEFAULT)
Log.d("Tag", "Converting time was : ${SystemClock.elapsedRealtime() - start}")
})
thread.start()
thread.join()
socket.emit("message", message)
}
private fun getBytesFromBitmap(bitmap: Bitmap): ByteArray? {
val stream = ByteArrayOutputStream()
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream)
return stream.toByteArray()
}
我实际上一直期望本机代码比Flutter的要快得多,但事实并非如此。Flutter的转换大约需要50毫秒,而本机的转换大约需要2000-3000毫秒。 我以为可能是线程化,所以我尝试在后台线程上针对本机代码运行此转换,但没有帮助。 您能否告诉我为什么时间如此不同,以及如何更好地在本机代码中实现它?有没有一种方法可以省略对Bitmap等的转换?也许这太长了。
编辑。添加了getBytesFromBitmap函数
答案 0 :(得分:3)
您看到的区别是,在颤动代码中,您仅读取数据而没有任何图像解码,而在kotlin中,您首先将其解码为Bitmap
,然后compress()
将其返回-如果您想要加快速度,只需调用InputStream
即可获得Resources#openRawResource
并无需任何解码即可读取图像资源
答案 1 :(得分:0)
它与将其转换为字节的方式有关...您可以发表您的文章吗? getBytesFromBitmap函数吗?另外,本机代码的转换实际上应该在后台线程中完成,在这种情况下,请上传您的结果。