【问题标题】:How to convert image to uint8list in flutter without using async?如何在不使用异步的情况下将图像转换为 uint8list?
【发布时间】:2019-12-07 10:00:33
【问题描述】:

PdfImage 需要 Uint8List 作为参数,但我有 ImageProvider。那么flutter中如何将image转为uint8list呢?

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

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

使用 FutureBuilder:

【问题讨论】:

  • 简单地使用rootBundle.load(),因为它返回一个Future,你必须在load完成后使用then方法
  • 你的答案在正常情况下是正确的。但就我而言,它有点不同。我必须以 pdf 格式渲染图像。所以,我需要在无状态小部件中没有异步函数的情况下工作
  • 我在哪里说async?我说:用then方法
  • 我必须在返回无状态小部件的构建函数中使用它。那么,该怎么做呢?
  • Nope 使用包时无法使用:'package:flutter/widgets.dart' as fw;和“包:pdf/widgets.dart”

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


【解决方案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,
  );

  ...
}

【讨论】:

  • await 表达式只能在异步函数中使用。尝试用 'async' 或 'async*' 标记函数体??
  • 是否可以在没有异步调用的情况下进行转换?
  • 你的答案在正常情况下是正确的。但就我而言,它有点不同。我必须以 pdf 格式渲染图像。所以,我需要在无状态小部件中没有异步函数的情况下工作。
  • 对不起,这是我知道的唯一方法
  • 使用过的包:'package:flutter/widgets.dart' as fw;和“包:pdf/widgets.dart”;
【解决方案2】:

如果您愿意,可以将 initState 一分为二:

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

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-22
      • 2012-10-01
      • 2021-09-20
      • 2022-01-18
      • 2015-04-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多