Flutter - конвертируйте и изменяйте размер изображения актива в изображение пользовательского интерфейса. - PullRequest
1 голос
/ 27 января 2020

Я пытаюсь взять изображение актива, изменить его размер до произвольной ширины и высоты и преобразовать изображение в изображение dart ui, чтобы я мог нарисовать изображение на холсте, используя drawImage метод. Это позволяет настроить изображение для экрана разных размеров.

Однако я столкнулся с проблемой изменения размера изображения. Я пробовал несколько разных подходов, но лучшее, что мне удалось, - это нарисовать правильные данные изображения с обрезанным, а не с измененным размером изображения, недействительными данные (неправильное декодирование c) с правильным размером или правильное изображение данные при невозможности изменить размер изображения.

Мои именованные операции импорта:

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

Я также пытался использовать метод Bitmap, используемый здесь , но обнаружил ошибку в предоставленной функции

Неудачное утверждение: строка 274 pos 12: 'bitmap.length == size ': не соответствует действительности

в моей попытке использования после изменения размера изображения.

Буду очень признателен за любую помощь в решении этой проблемы, заранее спасибо.

1 Ответ

1 голос
/ 23 февраля 2020

Некоторое время назад работал над этим побочным проектом, но смог выполнить sh преобразование и изменить размер с помощью пакета 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...