Как мне извлечь или найти пиксели определенного цвета в Uint8List?

#flutter #dart

#flutter #dart

Вопрос:

У меня есть функция, которая возвращает данные изображения как Uint8List . Изображение можно просмотреть с помощью Image.memory() .

Пиксели в изображении имеют цветовую кодировку с определенными значениями. [Они выводятся из сети сегментации]

Вместо того, чтобы просто раскрашивать обнаруженные / распознанные пиксели в выходном изображении, я хочу извлечь эти отдельные пиксели. В выходном изображении есть пиксели, которые были окрашены с использованием цвета: Color.fromARGB(255, 64, 0, 0).value .

Я хочу извлечь только пиксели, имеющие этот цвет. Как бы мне извлечь эти выбранные пиксели из Uint8List ?

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

1. Если изображение не в растровом формате, удачи вам в получении удобочитаемых пиксельных данных непосредственно из байтов.

2. @Abion47 Почему ты так говоришь? в image пакете и dart:ui уже реализовано кодирование / декодирование.

3. Вы спрашиваете, как получить пиксельные данные непосредственно из Uint8List , которые вы извлекли из своей функции. Это предшествует любому из методов декодирования, реализованных в Image , поэтому вы все еще застряли с закодированными двоичными данными. Таким образом, если эти двоичные данные не закодированы в формате, который хранит пиксельные данные в виде простых байтов, вы не сможете напрямую получить какие-либо полезные пиксельные данные из вашего списка. Сначала вам нужно его декодировать.

4. @Abion47 Итак, это декодирование. Не имеет большого значения, поскольку оно уже реализовано.

5. Действительно.

Ответ №1:

Вы можете скопировать вставить запустить полный код ниже,
вы можете использовать package:image/image.dart ‘s getBytes()
Рабочая демонстрация измените изображение на pixel красное на 0, вы можете увидеть эффект ниже
фрагмента кода

 import 'package:image/image.dart' as img;
...
Future<img.Image> _changeImage() async {
    var response = await http.get('https://picsum.photos/250?image=9');
    Uint8List bytes = await response.bodyBytes;
    img.Image image = img.decodeImage(bytes);
    var pixels = image.getBytes();
    for (int i = 0, len = pixels.length; i < len; i  = 4) {
      /*print(
          "r ${pixels[i]} g ${pixels[i   1]} b ${pixels[i   2]} a ${pixels[i   3]} ");*/

      pixels[i] = 0;
    }

    return image;
  }
  

рабочая демонстрация

введите описание изображения здесь

полный код

 import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'dart:typed_data';
import 'package:image/image.dart' as img;

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;
  Future<img.Image> _future;

  Future<img.Image> _changeImage() async {
    var response = await http.get('https://picsum.photos/250?image=9');
    Uint8List bytes = await response.bodyBytes;
    img.Image image = img.decodeImage(bytes);
    var pixels = image.getBytes();
    for (int i = 0, len = pixels.length; i < len; i  = 4) {
      /*print(
          "r ${pixels[i]} g ${pixels[i   1]} b ${pixels[i   2]} a ${pixels[i   3]} ");*/

      pixels[i] = 0;
    }

    return image;
  }

  @override
  void initState() {
    _future = _changeImage();
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Image.network("https://picsum.photos/250?image=9"),
            FutureBuilder(
                future: _future,
                builder: (context, AsyncSnapshot<img.Image> snapshot) {
                  switch (snapshot.connectionState) {
                    case ConnectionState.none:
                      return Text('none');
                    case ConnectionState.waiting:
                      return Center(child: CircularProgressIndicator());
                    case ConnectionState.active:
                      return Text('');
                    case ConnectionState.done:
                      if (snapshot.hasError) {
                        return Text(
                          '${snapshot.error}',
                          style: TextStyle(color: Colors.red),
                        );
                      } else {
                        return Image.memory(img.encodePng(snapshot.data));
                      }
                  }
                }),
            Text(
              'You have pushed the button this many times:',
            ),
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.headline4,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _changeImage,
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ),
    );
  }
}
  

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

1. Большое спасибо, это именно то, чего я стремился достичь 🙂