mirror of
https://github.com/rustdesk/rustdesk.git
synced 2024-12-23 10:07:49 +08:00
efe6d080f3
Signed-off-by: fufesou <shuanglongchen@yeah.net>
50 lines
1.2 KiB
Dart
50 lines
1.2 KiB
Dart
import 'dart:typed_data';
|
|
import 'dart:ui' as ui;
|
|
|
|
Future<ui.Image> decodeImageFromPixels(
|
|
Uint8List pixels,
|
|
int width,
|
|
int height,
|
|
ui.PixelFormat format, {
|
|
int? rowBytes,
|
|
int? targetWidth,
|
|
int? targetHeight,
|
|
bool allowUpscaling = true,
|
|
}) async {
|
|
if (targetWidth != null) {
|
|
assert(allowUpscaling || targetWidth <= width);
|
|
}
|
|
if (targetHeight != null) {
|
|
assert(allowUpscaling || targetHeight <= height);
|
|
}
|
|
|
|
final ui.ImmutableBuffer buffer =
|
|
await ui.ImmutableBuffer.fromUint8List(pixels);
|
|
final ui.ImageDescriptor descriptor = ui.ImageDescriptor.raw(
|
|
buffer,
|
|
width: width,
|
|
height: height,
|
|
rowBytes: rowBytes,
|
|
pixelFormat: format,
|
|
);
|
|
if (!allowUpscaling) {
|
|
if (targetWidth != null && targetWidth > descriptor.width) {
|
|
targetWidth = descriptor.width;
|
|
}
|
|
if (targetHeight != null && targetHeight > descriptor.height) {
|
|
targetHeight = descriptor.height;
|
|
}
|
|
}
|
|
|
|
final ui.Codec codec = await descriptor.instantiateCodec(
|
|
targetWidth: targetWidth,
|
|
targetHeight: targetHeight,
|
|
);
|
|
|
|
final ui.FrameInfo frameInfo = await codec.getNextFrame();
|
|
codec.dispose();
|
|
buffer.dispose();
|
|
descriptor.dispose();
|
|
return frameInfo.image;
|
|
}
|