颤振 - 将资产图像转换和调整大小为飞镖 UI 图像



我正在尝试获取资产图像,将图像大小调整为任意宽度和高度,并将图像转换为dart UI图像,以便我可以使用drawImage方法在画布上绘制图像。这样我就可以针对不同的屏幕尺寸调整图像。

但是,我在调整图像大小时遇到了问题。我尝试了几种不同的方法,但我管理的最好的方法是绘制正确的图像数据,裁剪图像而不是调整大小,以正确的大小使数据无效(不正确的静态解码(,或者在无法调整图像大小时绘制正确的图像数据。

我命名的导入是

import 'dart:io' as io;
import 'dart:ui' as ui;
import 'package:flutter/widgets.dart' as widgets;
import 'package:image/image.dart' as image;

我的一些尝试如下:

显示正确的图像数据,但无法调整大小:

Future<ui.Image> loadUiImage(String imageAssetPath) async {
widgets.Image widgetsImage = widgets.Image.asset(imageAssetPath, scale: 0.5);
Completer<ui.Image> completer = Completer<ui.Image>();
widgetsImage.image
.resolve(widgets.ImageConfiguration(size: ui.Size(10, 10)))
.addListener(widgets.ImageStreamListener((widgets.ImageInfo info, bool _){
completer.complete(info.image);
}));
return completer.future;
}

错误地裁剪图像而不调整大小,尽管图像数据是正确的:

Future<ui.Image> loadUiImage(String imageAssetPath) async {
final ByteData data = await rootBundle.load(imageAssetPath);
List<int> bytes = data.buffer.asUint8List();
image.Image iconImage = image.Image.fromBytes(100, 100, bytes);
final Completer<ui.Image> completer = Completer();
ui.decodeImageFromList(image.decodePng(image.encodePng(iconImage)).getBytes(), (ui.Image img) {
return completer.complete(img);
});
return completer.future;
}

图像数据无效,正确调整图像大小:

Future<ui.Image> loadUiImage(String imageAssetPath) async {
final ByteData data = await rootBundle.load(imageAssetPath);
List<int> bytes = data.buffer.asUint8List();
image.Image iconImage = image.Image.fromBytes(100, 100, bytes);
final Completer<ui.Image> completer = Completer();
ui.decodeImageFromList(image.encodePng(iconImage), (ui.Image img) {
return completer.complete(img);
});
return completer.future;
}

我也尝试使用此处使用的位图方法,但在提供的函数中遇到了错误

断言失败:第 274 行 pos 12:"位图长度 == 大小":不正确

在我尝试调整图像大小后尝试使用。

我将非常感谢任何解决此问题的帮助,提前感谢您。

自从能够处理这个副项目以来已经有一段时间了,但能够使用图像包完成转换和调整大小:

import 'dart:ui' as ui;
import 'package:image/image.dart' as image;
import 'package:flutter/services.dart';
Future<ui.Image> getUiImage(String imageAssetPath, int height, int width) async {
final ByteData assetImageByteData = await rootBundle.load(imageAssetPath);
image.Image baseSizeImage = image.decodeImage(assetImageByteData.buffer.asUint8List());
image.Image resizeImage = image.copyResize(baseSizeImage, height: height, width: width);
ui.Codec codec = await ui.instantiateImageCodec(image.encodePng(resizeImage));
ui.FrameInfo frameInfo = await codec.getNextFrame();
return frameInfo.image;
}

您可以在不使用image包的情况下实现此目的:

Future<ui.Image> getUiImage(String imageAssetPath, int height, int width) async {
final ByteData assetImageByteData = await rootBundle.load(imageAssetPath);
final codec = await ui.instantiateImageCodec(
assetImageByteData.buffer.asUint8List(),
targetHeight: height,
targetWidth: width,
);
final image = (await codec.getNextFrame()).image;
}

最新更新