Image 颤振-将资源图像转换为dart ui图像并调整其大小

Image 颤振-将资源图像转换为dart ui图像并调整其大小,image,flutter,dart,Image,Flutter,Dart,我正在尝试获取一个资源图像,将图像调整为任意宽度和高度,并将图像转换为dart ui图像,以便使用该方法在画布上绘制图像。这样我就可以根据不同的屏幕大小调整图像 然而,我遇到了一个问题,调整图像的大小。我尝试了几种不同的方法,但我所能做到的最好的方法是,要么在图像被裁剪而不是被调整大小的情况下绘制正确的图像数据,要么在正确大小的情况下绘制无效的数据(错误的静态解码),要么在无法调整图像大小的情况下绘制正确的图像数据 我的命名导入是 import 'dart:io' as io; import '

我正在尝试获取一个资源图像,将图像调整为任意宽度和高度,并将图像转换为dart ui图像,以便使用该方法在画布上绘制图像。这样我就可以根据不同的屏幕大小调整图像

然而,我遇到了一个问题,调整图像的大小。我尝试了几种不同的方法,但我所能做到的最好的方法是,要么在图像被裁剪而不是被调整大小的情况下绘制正确的图像数据,要么在正确大小的情况下绘制无效的数据(错误的静态解码),要么在无法调整图像大小的情况下绘制正确的图像数据

我的命名导入是

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 loadUiImage(字符串imageAssetPath)异步{
widgets.Image-widgetsImage=widgets.Image.asset(imageAssetPath,比例:0.5);
Completer Completer=Completer();
widgetsImage.image
.resolve(widgets.ImageConfiguration(大小:ui.size(10,10)))
.addListener(widgets.ImageStreamListener((widgets.ImageInfo,bool)){
completer.complete(信息图像);
}));
返回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 loadUiImage(字符串imageAssetPath)异步{
最终ByteData数据=等待rootBundle.load(imageAssetPath);
List bytes=data.buffer.asUint8List();
image.image iconImage=image.image.fromBytes(100100bytes);
最终完成者完成者=完成者();
ui.decodeImageFromList(image.decodePng(image.encodePng(iconImage)).getBytes(),(ui.image img){
返回完成符。完成(img);
});
返回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;
}
Future loadUiImage(字符串imageAssetPath)异步{
最终ByteData数据=等待rootBundle.load(imageAssetPath);
List bytes=data.buffer.asUint8List();
image.image iconImage=image.image.fromBytes(100100bytes);
最终完成者完成者=完成者();
ui.decodeImageFromList(image.encodePng(iconImage),(ui.image img){
返回完成符。完成(img);
});
返回completer.future;
}
我还尝试使用使用的位图方法,但在提供的函数中遇到了一个错误

断言失败:第274行位置12:“bitmap.length==size”:不正确

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


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

已经有一段时间了,因为我能够处理此端项目,但能够使用软件包完成转换和调整大小:

将'dart:ui'导入为ui;
导入“package:image/image.dart”作为图像;
导入“包:flifter/services.dart”;
Future getUiImage(字符串imageAssetPath、整数高度、整数宽度)异步{
final ByteData assetImageByteData=等待rootBundle.load(imageAssetPath);
image.image baseSizeImage=image.decodeImage(assetImageByteData.buffer.asUint8List());
image.image resizeImage=image.copyrize(baseSizeImage,高度:高度,宽度:宽度);
ui.Codec Codec=wait ui.instantialeimagecodec(image.encodePng(resizeImage));
ui.FrameInfo FrameInfo=wait codec.getNextFrame();
返回frameInfo.image;
}
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;
}