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;
 | |
| }
 |