简体   繁体   中英

How to convert image to uint8list in flutter without using async?

PdfImage requires Uint8List as param but I have ImageProvider . So how can we convert image to uint8list in flutter?

var imageProvider = AssetImage('assets/test.jpg');

final image = PdfImage(
  pdf.document,
  image:???, /// Uint8List required
  width: img.width,
  height: img.height,
);

Using FutureBuilder: 在此处输入图像描述

Use rootBundle.load()

(await rootBundle.load(/*YOUR IMAGE PATH HERE*/)).buffer.asUint8List()

UPDATE

As load() is an async operation, you need to wait until the data is fully loaded. Try substituting the UI with some loading indicator until then.

ByteData imageData;

@override
void initState() {
  rootBundle.load('assets/test.jpg')
    .then((data) => setState(() => this.imageData = data));
}

@override
Widget build(BuildContext context) {
  if (imageData == null) {
    return Center(child: CircularProgressIndicator());
  }

  final image = PdfImage(
    pdf.document,
    image: imageData.buffer.asUint8List(),
    width: img.width,
    height: img.height,
  );

  ...
}

You could split initState into two if you prefer:

@override
void initState() {
  loadAsset('test.jpg');
}

void loadAsset(string name) async {
  var data = await rootBundle.load('assets/$name');
  setState(() => this.imageData = data);
}

Note that this will cause build() to run an extra time but I find it easier on the eye. With Michael's circular Indicator, this is a harmless extra cycle.

in Flutter, attaching local image to pdf file. Actually It's a simple solution to add our local image to pdf file. just copy paste the following code and try

final ByteData bytes = await rootBundle.load('assets/logo.jpg');
final Uint8List list = bytes.buffer.asUint8List();

final image = PdfImage.file(
  pdf.document,
  bytes: list,
);

pdf.addPage(pw.Page(build: (pw.Context context) {
  return pw.Center(
    child: pw.Image(image),
  ); // Center
}));

I tried different solutions to convert image to UInt8List and finally found one Solution. It worked for me.

XFile? image = await imagePicker.pickImage(
     source: ImageSource.gallery,
); // Upload file from gallery

final bytes = await image!.readAsBytes(); // Converts the file to UInt8List

for the output, i used MemoryImage

MemoryImage(bytes!);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM