首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ImageProvider<>:将RawImage转换为扩展Flutter的东西?

ImageProvider<>:将RawImage转换为扩展Flutter的东西?
EN

Stack Overflow用户
提问于 2019-10-12 10:40:26
回答 2查看 1.7K关注 0票数 2

我有一个RawImage小部件,但实际上我需要一个图像提供程序(如AssetImage或MemoryImage),以便可以从它构建一个DecorationImage。这有可能吗?我尝试了很多方法,包括尝试从原始的字节值构造MemoryImage,但到目前为止都没有成功……

如有任何帮助,我们将不胜感激!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-10-12 11:09:31

最简单的方法是通过PNG,它对原始图像的像素和几何形状进行编码。例如:

代码语言:javascript
复制
Future<MemoryImage> convert(RawImage rawImage) async {
  var byteData = await rawImage.image.toByteData(
    format: ui.ImageByteFormat.png,
  );
  return MemoryImage(byteData.buffer.asUint8List());
}

这有一个不必要的压缩/解压缩的缺点,但不会注意到小图像。要避免这种情况,请使用ui.ImageByteFormat.rawRgba并预先添加一个BMP文件头。(文件头用于将几何体传递给内存图像解码器。)

票数 2
EN

Stack Overflow用户

发布于 2020-04-03 06:14:56

这里有一个解决方案,它不需要不必要的拷贝或压缩/解压缩。这是因为ImageProvider最终需要返回一个ui.Image。如果你已经有了它,你可以跳过所有花哨的缓存和ImageProvider的异步加载逻辑。我使用implements而不是extends来丢弃基本实现,并返回一个自定义ImageStreamCompleter,它只是将ui.Image转发给小部件。

代码语言:javascript
复制
import 'dart:ui' as ui;

class RawImageProvider implements ImageProvider {
  final ui.Image image;

  RawImageProvider(this.image);

  @override
  ImageStreamCompleter load(key, decode) => throw UnimplementedError();

  @override
  Future obtainKey(ImageConfiguration cfg) => throw UnimplementedError();

  @override
  Future<bool> evict({
    ImageCache cache,
    ImageConfiguration configuration = ImageConfiguration.empty,
  }) {
    return SynchronousFuture(true);
  }

  @override
  ImageStream resolve(ImageConfiguration configuration) {
    return ImageStream()..setCompleter(RawImageStreamCompleter(image));
  }

  void dispose() => image?.dispose();
}

class RawImageStreamCompleter extends ImageStreamCompleter {
  RawImageStreamCompleter(ui.Image image) {
    setImage(ImageInfo(image: image));
  }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58350389

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档