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