Как сохранить цвет int32 при передаче его изображению Uint8List во Flutter? - PullRequest
0 голосов
/ 13 февраля 2020

Я использую Flutter и пытаюсь создать приложение для рисования, которое принимает изображение в формате PNG (RGBA), цвет (значение int32) и местоположение нажатия пользователя. Затем он должен заполнить Flood области. Оно работает. Но медленно и цвет изменился с int32 на int8.

Например:

enter image description here

Выбранный цвет (на внизу слева): Цвет (0xffdf6899) ​​(pinki sh фиолетовый цвет)
Но цвет, отображаемый на экране после заливки, равен 0xff916ad8 (фиолетовый цвет)

Примечание:
- я используя пакет изображений, созданный Бренданом Дунканом
- я импортирую Image.dart как img и Dart: ui как ui, потому что в image.dart и dart существует противоречивое определение изображения: ui
- Вот мой флаттер - версия:
Флаттер 1.13.2 • канал неизвестен • неизвестный источник
Framework • версия 4944622b5d (9 недель go) • 2019-12-12 18:43:58 + 0000
Engine • ревизия 12bf95fd49
Инструменты • Dart 2.7.0 (сборка 2.7.0-dev.2.1 8b8894648f)

Посмотрите на код ниже:

    import 'dart:ui' as ui;
    import 'package:image/image.dart' as img;

    ...


    // getting tap location on screen
    final x = tapLocation.dx.floor();
    final y = tapLocation.dy.floor();

    // _artImageBytes is an Uint8List we get from reading the PNG file
    final testImage = img.decodeImage(_artImageBytes);

    // getting the actual location in the image (pixel coordinate)
    final interpolation = testImage.width / size.width;
    final dx = (x * interpolation).floor();
    final dy = (y * interpolation).floor();

    // the flood fill algorithm from Image package
    final newImage = img.fillFlood(testImage, dx, dy, color.value,
        compareAlpha: true);

    ui.Image newArtworkImage;

    // Converting the img.Image back to ui.Image
    ui.decodeImageFromPixels(newImage.getBytes(), newImage.width,
        newImage.height, ui.PixelFormat.rgba8888, (image) {
      newArtworkImage = image;
    });

    // has to wait 200 milliseconds
    await Future.delayed(Duration(milliseconds: 200));

    // display to screen
    _artCanvas = CustomPaint(
      painter: ArtworkPainter(
        artworkImage: newArtworkImage,
        colorItem: color,
        tapLocation: tapLocation,
      ),
    );

Дополнительное примечание: tapLocation (передан из GestureDetector, уже локализован), цвет - это выбранный пользователем цвет (в данном случае это 0xffdf6899) ​​и размер (размер экрана, переданный из пользовательского интерфейса MediaQuery).
И, как вы, вероятно, знаете, color.value возвращает тип данных Uint32. Но decodeImageFromPixel принимает Uint8List, поэтому мы конвертируем изображение в Uint8List.

Итак, вопрос в том, как сохранить исходный цвет (Uint32) при передаче данных типа Uint8List. Таким образом, сохранить правильный цвет?

Любая помощь приветствуется! Спасибо !!

Дополнительные примеры

Ниже приведены примеры, показывающие правильную окраску (зеленый и черный), поскольку цвета Uint8:
enter image description here enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...