Я использую Flutter и пытаюсь создать приложение для рисования, которое принимает изображение в формате PNG (RGBA), цвет (значение int32) и местоположение нажатия пользователя. Затем он должен заполнить Flood области. Оно работает. Но медленно и цвет изменился с int32 на int8.
Например:
![enter image description here](https://i.stack.imgur.com/Ex0Q5.jpg)
Выбранный цвет (на внизу слева): Цвет (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](https://i.stack.imgur.com/YJjiy.jpg)