Flutter,dart:io - 将 Uint8List(来自 websocket)转换为我可以绘制的 jpeg 文件
Flutter, dart:io - convert Uint8List (from websocket) to a jpeg file I can draw
我编写了一个简单的 nodejs ws websocket 服务器,当客户端连接如下时,它提供二进制 jpeg 文件:
import WebSocket = require("ws");
console.log("Websocket is starting...");
// Setup websocket
const wss = new WebSocket.Server({ port: 8080 });
wss.on("connection", function connection(webSocket) {
console.log("Connected");
webSocket.on("message", function incoming(message) {
console.log("received: %s", message);
});
webSocket.on("error", function error(err) {
console.log(err.error);
});
webSocket.send(binaryJpegFile);
});
这段代码有一个错误,因为它默认以文本形式发送,所以我替换了:
webSocket.send(binaryJpegFile);
与:
webSocket.send(binaryJpegFile, {binary: true});
现在我的 flutter 代码使用以下代码接收二进制 jpeg 文件作为 Uint8List:
WebSocket socket;
void handleWebSocket(data) {
// Listen for incoming data. We expect the data to be a JSON-encoded String.
print("WebSocket data received");
if (data.runtimeType == String) {
print("String received");
String dataString = data;
print(dataString.length);
print(dataString);
} else if (data.runtimeType == Uint8List) {
print("Binary received");
Uint8List binaryIntList = data;
print(binaryIntList.lengthInBytes);
} else {
print("Unknown datatype recieved : " + data.runtimeType.toString());
}
}
connect() async {
if (socket == null) {
socket = await WebSocket.connect('ws://localhost:8080');
socket.listen(handleWebSocket);
}
socket.add('Hello, World!');
}
@override
void initState() {
super.initState();
connect();
}
任何人都可以提供有关如何将 Uint8List 转换为我可以绘制的 jpeg 文件的提示吗?
首先尝试将 Uint8List
直接与 Image.memory
小部件一起使用。
示例:
new Image.memory(binaryIntList);
如果没有按预期工作。
您可以使用 image
dart 包首先将字节解码为 Image
对象,然后将其编码为您希望的格式。
示例:
import 'package:image/image.dart' as I; //So that this does not conflict with the Image widget
然后
I.Image _img = I.decodeImage(binaryIntList);
_img = I.encodeJpg(_img);
然后用作
new Image.memory(_img.getBytes());
希望对您有所帮助!
Image.memory(binaryIntList);
总是有用的,祝你好运
我编写了一个简单的 nodejs ws websocket 服务器,当客户端连接如下时,它提供二进制 jpeg 文件:
import WebSocket = require("ws");
console.log("Websocket is starting...");
// Setup websocket
const wss = new WebSocket.Server({ port: 8080 });
wss.on("connection", function connection(webSocket) {
console.log("Connected");
webSocket.on("message", function incoming(message) {
console.log("received: %s", message);
});
webSocket.on("error", function error(err) {
console.log(err.error);
});
webSocket.send(binaryJpegFile);
});
这段代码有一个错误,因为它默认以文本形式发送,所以我替换了:
webSocket.send(binaryJpegFile);
与:
webSocket.send(binaryJpegFile, {binary: true});
现在我的 flutter 代码使用以下代码接收二进制 jpeg 文件作为 Uint8List:
WebSocket socket;
void handleWebSocket(data) {
// Listen for incoming data. We expect the data to be a JSON-encoded String.
print("WebSocket data received");
if (data.runtimeType == String) {
print("String received");
String dataString = data;
print(dataString.length);
print(dataString);
} else if (data.runtimeType == Uint8List) {
print("Binary received");
Uint8List binaryIntList = data;
print(binaryIntList.lengthInBytes);
} else {
print("Unknown datatype recieved : " + data.runtimeType.toString());
}
}
connect() async {
if (socket == null) {
socket = await WebSocket.connect('ws://localhost:8080');
socket.listen(handleWebSocket);
}
socket.add('Hello, World!');
}
@override
void initState() {
super.initState();
connect();
}
任何人都可以提供有关如何将 Uint8List 转换为我可以绘制的 jpeg 文件的提示吗?
首先尝试将 Uint8List
直接与 Image.memory
小部件一起使用。
示例:
new Image.memory(binaryIntList);
如果没有按预期工作。
您可以使用 image
dart 包首先将字节解码为 Image
对象,然后将其编码为您希望的格式。
示例:
import 'package:image/image.dart' as I; //So that this does not conflict with the Image widget
然后
I.Image _img = I.decodeImage(binaryIntList);
_img = I.encodeJpg(_img);
然后用作
new Image.memory(_img.getBytes());
希望对您有所帮助!
Image.memory(binaryIntList);
总是有用的,祝你好运