#image #flutter #dart #bitmap #flutter-image
#изображение #флаттер #dart #растровое изображение #flutter-изображение
Вопрос:
Я смог получить потоковое видео, преобразовав данные uint8 в байты (код ниже), но это просто выглядит как статическое. Я думаю, что что-то не так с моим заголовком bitmap (я думаю, что он отсутствует). Не мог бы кто-нибудь сказать мне, пожалуйста, есть ли что-нибудь, что я могу включить из необработанных данных, которые я получаю для заголовка bitmap?
Информация о сообщении, которое я получаю:http://docs.ros.org/melodic/api/sensor_msgs/html/msg/Image.html
Пример полученных необработанных данных изображения:
{кодировка: bgr8, высота: 480, заголовок: {штамп: {секунды: 1599095871, nsecds: 933816910}, frame_id: bottom_camera_front, seq: 4766}, шаг: 1920, данные: gnZ8gnZ8gnZ8gnZ8gXZ5gXZ5f3V7f3V7fXZ7fXZ7fHR7fXV8fXV/fnaAfXV/e3Z/eXd9d3d9d3d9d3d9eXd9eXd9e3d9e3d9fXZ9fXZ9fnZ9fnZ9fnZ9fnZ9gHV9fnZ9fXl/enh enh enh eXd9eHZ8enh fXuBfHqAe3l/fXl/fHh fnd fnd gHh/gHh/hHmBhHmBgnqBgnqBgXqBgXqBfHqAfHqAenqAe3uBe3uBe3uBeXyBen2Cen2CfHyCfXuBf3uBf3uBf3uBf3uBf3uBf3uBf3uBgHyCgHyCgHyCgHyCgHyCgHyCgHyCgHyCgnuCgnuCgHyCgHyCfnyCfnyCe3qDe3qDd3qCd3qCdXqDdnuEdHuEdHuEcnuEcnuEdHyDdHyDdnyDdnyDeHuDeXuDeXuDe3qDfXqDfHmCfHmCfHmCfHmCfHmCfHmCfXqDeXqEenuFe3yGfH2HfH6GfX HfX HfX HfH EfH EfH EfH Ee36De36De36Ce36Cfn6Efn6Ef3 Ff3 FgIGFf4CEfYCEfH DfH De36Ce36CfH DfH Ee36Den2CfX2Df3 FgX FgX FgX FgX FgX Ff3 Ff3 Ff3 Ff3 Ff3 Ff3 FfYCFfYCFfYCFfYCFfIGEfIGEfIGEfIGEeoGEeoGEeoCFe4GGe4GGfYGGfYGGgICGgICGgoCGhICGhICGh3 Jhn6IhH IhH Ig36HhH IgoCGgoCGgX FgX Fg3 EhICFhYGGhYGGiIKHiYKHiYGIi4CIi4CIi4CIi4CIi4CIiYKHiYKHioOIioOIiIOFiIOFiIOFiIOFiYSGiYOIh4CHh3 Jh4CHhn Gh4CHh4CHiYGIioKJi4SJi4SJioOIio
Widget _buildVideoOutput(snapshot) {
if (!snapshot.hasData) {
return Text("");
}
var msg = snapshot.data;
// print(msg);
var rawDataString = msg["data"]; //uint8 string (bgr8)
// print(rawDataString);
var secs = msg["header"]["stamp"]["secs"];
// print(secs); //time in secs
List<int> bytes = utf8.encode(rawDataString); //convert data to bytes
// print(bytes);
Uint8List dataInts = Uint8List.fromList(bytes);
// print(dataInts);
int imageWidth = 640;
int imageHeight = 480;
Bitmap bitmap = Bitmap.fromHeadless(imageWidth, imageHeight, dataInts);
// Bitmap brightBitmap = bmp.brightness(bitmap, 0.2);
// Bitmap nowThisBitmapLooksWeird = bmp.contrast(brightBitmap, 1.5);
// Bitmap finalBitmap =
// bmp.adjustColor(nowThisBitmapLooksWeird, saturation: 1.0);
Uint8List headedBitmap = bitmap.buildHeaded();
//ui.Image outputImage = await bitmap.buildImage();
//canvas.drawImage(outputImage, Offset.zero, ui.Paint());
Image image = Image.memory(
headedBitmap,
fit: BoxFit.none,
);
return image;
}
Комментарии:
1. Ваши данные, похоже, подразумевают, что ваше изображение имеет высоту 480 пикселей, но вы указываете BMP, что это 390×310…
2. Я не думал об этом. Я изменил высоту и ширину на 480 пикселей, и, похоже, я могу начать видеть некоторые формы, но в нем все еще много статики, и изображение повторяется по ширине.
3. Я не говорю «flutter / dart» , поэтому я здесь только предполагаю. Если изображение имеет формат bgr8, оно должно содержать 3 байта / пиксель. Если шаг равен 1920, это означает, что каждая строка начинается с 1920 байт после предыдущей, поэтому изображение должно иметь ширину 640 и высоту 480. Вы пробовали это в своем BMP? Это также означает, что ваши данные должны быть 640 * 480 * 3 длиной в байты. Это работает?
4. Большое вам спасибо за эту информацию! Мне удалось изменить высоту и ширину на правильные значения, и мое изображение теперь показывает правильные формы, но белый цвет отображается как черный и т.д.
5. Я все еще не говорю «флаттер / дротик» , но, полагаю, у вас есть функция
negate()
илиinvert()
? Или установите для каждого пикселя значениеpixel = 255 - pixel
.