我正在尝试将从资源中获取的图像转换为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]);
}
}
Kotlin代码:
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的转换大约需要50ms,而原生代的大约需要2000-3000ms。我认为Threading可能就是这种情况,所以我试图在后台线程上为本机代码运行此转换,但它没有帮助。你能告诉我为什么会有这么不同的时间,以及如何在本机代码中更好地实现它?有没有办法省略转换到Bitmap等?也许这让它变得如此之久。
编辑。添加了getBytesFromBitmap函数
您看到的差异是,在颤动的代码中,您只是在没有任何图像解码的情况下读取您的数据,而在kotlin中,您首先解码到Bitmap
,然后您将compress()
ing回来 - 如果您想要加速它只需通过调用InputStream
获得Resources#openRawResource
并且无需任何解码即可读取您的图像资源
它与将其转换为字节的方式有关...你能发布你的getBytesFromBitmap函数吗?另外,本机代码的转换确实应该在后台线程中完成,请在这种情况下上传您的结果。