Преобразование обычного списка UINT8 в виджет изображений

#image #flutter #dart

Вопрос:

Я новичок в Flutter, и у меня есть вопрос, касающийся моего небольшого проекта.

Я пытаюсь показать изображение, которое я получаю через сокет. У меня есть список uint8, представляющий матрицу изображений (никак не закодированную), и я успешно преобразовал его в виджет изображений со следующим кодом:

 Image im = Image.fromBytes(1280, 1024, frameData, format: Format.luminance);
var jpgImage = encodeJpg(im);
.
.
//In Widget:
return Image.memory(jpgImage, gaplessPlayback: true);
 

и это работает, но на это уходит слишком много времени.
Я вижу, что функция encodeJpg занимает не менее 150 мс, что для меня слишком много, потому что каждое такое изображение является частью потокового видео.

Мой вопрос в том, как я могу преобразовать обычный(не закодированный) Uint8List — представление регулярной матрицы, 0-256 значений, для виджета изображения наиболее эффективным способом?

Спасибо!

Комментарии:

1. MemoryImage(uint8List) api.flutter.dev/flutter/painting/MemoryImage-class.html

2. выше или Image.memory(Uint8List) api.flutter.dev/flutter/widgets/Image/Image.memory.html

3. MemoryImage (и, что эквивалентно, Image.memory ) Ожидайте, что необработанные байты будут иметь изображение PNG, изображение JPEG и т. Д. Я не уверен, что они распознали бы необработанный поток значений RGB (и не знали бы, что эти байты представляют данные RGB, BGR, RGBA, ARGB и т. Д.). Image Класс (от dart:ui ) может помочь.

Ответ №1:

Виджет изображения имеет несколько конструкторов, и один из них-память.

Проверьте Image.memory(bytes) конструктор фабрики.

https://api.flutter.dev/flutter/widgets/Image/Image.memory.html

Ответ №2:

Вы можете использовать Bitmap для создания списка UINT8 с заголовком, который Image.memory() можно проанализировать.

как в https://pub.dev/packages/bitmap:

 import 'package:bitmap/bitmap.dart';

Bitmap bitmap = Bitmap.fromHeadful(imageWidth, imageHeight, theListOfInts); // Not async

// ..

Uint8List headedBitmap = bitmap.buildHeaded();

// ..
child: Image.memory(headedBitmap)
// ..