如何在不使用异步的情况下将图像转换为uint8list?

时间:2019-07-30 04:40:49

标签: image pdf image-processing flutter flutter-layout

PdfImage需要 Uint8List 作为参数,但是我有 ImageProvider 。那么,如何在抖动中将图像转换为uint8list?

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

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

使用FutureBuilder: enter image description here

3 个答案:

答案 0 :(得分:1)

使用rootBundle.load()

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

更新

由于load()是异步操作,因此您需要等待直到数据完全加载。在此之前,尝试用一些加载指示器替换UI。

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,
  );

  ...
}

答案 1 :(得分:0)

如果愿意,可以将initState分为两个:

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

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

请注意,这将导致build()额外运行,但我发现它更容易使用。使用迈克尔的圆形指示器,这是一个无害的额外周期。

答案 2 :(得分:0)

在Flutter中,将本地图像附加到pdf文件。 实际上,将本地图像添加到pdf文件是一种简单的解决方案。 只需复制粘贴以下代码,然后尝试

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