我有一个RawImage小部件,但实际上我需要一个图像提供程序(如AssetImage或MemoryImage),以便可以从它构建一个DecorationImage。这有可能吗?我尝试了很多方法,包括尝试从原始的字节值构造MemoryImage,但到目前为止都没有成功……
如有任何帮助,我们将不胜感激!
发布于 2019-10-12 11:09:31
最简单的方法是通过PNG,它对原始图像的像素和几何形状进行编码。例如:
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文件头。(文件头用于将几何体传递给内存图像解码器。)
发布于 2020-04-03 06:14:56
这里有一个解决方案,它不需要不必要的拷贝或压缩/解压缩。这是因为ImageProvider最终需要返回一个ui.Image。如果你已经有了它,你可以跳过所有花哨的缓存和ImageProvider的异步加载逻辑。我使用implements而不是extends来丢弃基本实现,并返回一个自定义ImageStreamCompleter,它只是将ui.Image转发给小部件。
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));
}
}https://stackoverflow.com/questions/58350389
复制相似问题