Сохранение образа памяти (например, Uint8list) в виде файла изображения в flutter

#flutter #dart #uint8array #uint8list

#flutter #dart #uint8array #uint8list

Вопрос:

У меня есть несколько списков Uint8, и я хочу сохранить их в виде файлов jpg. Я много искал это в Интернете, но ничего не нашел! Кто-нибудь может помочь?

Спасибо,

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

1. File у класса from dart.io есть методы для сохранения этого списка

2. Я не хочу сохранять список

3. «и я хочу сохранить их в хранилище» — так что вы хотите сделать на самом деле?

4. извините за плохое объяснение! отредактировано сейчас.

5. вопрос трудно понять. лучше объясните свой вопрос

Ответ №1:

Под «хранилищем» вы подразумеваете запись в файл? Для этого вам не нужен «flutter». Просто используйте библиотеки, предоставляемые dart. Вот пример загрузки моего gravatar, который вы можете получить как Uin8List , а затем сохранить его в файл.

 import 'dart:io';
import 'dart:typed_data';

import 'package:http/http.dart' as http;

void main() {
  http.get('https://www.gravatar.com/avatar/e944138e1114aefe4b08848a46465589').then((response) {
    Uint8List bodyBytes = response.bodyBytes;
    File('my_image.jpg').writeAsBytes(bodyBytes);
  });
}
 

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

1. ‘my_image.jpg ‘, где он будет храниться? Как мы можем установить конкретную папку для хранения файла?

2. Вы можете сохранить по определенному пути, например final dir = await getExternalStorageDirectory(); final myImagePath = dir!.path "/myimg.png"; File imageFile = File(myImagePath); if(! await imageFile.exists()){ imageFile.create(recursive: true); } imageFile.writeAsBytes(image);

3. @djalmafreestyler — он будет сохранен в «текущем рабочем каталоге», в котором вы запустили программу.

4. Обратите внимание, что это работает только потому, что Uint8List уже хранит данные изображения в формате JPEG. Таким образом, вопрос не отвечает на вопрос, как сохранить необработанные байты изображения (для чего я и пришел сюда), поскольку сначала они должны быть закодированы как PNG или JPEG или аналогичные. Я считаю, что здесь отсутствует шаг: ByteData byteData = await image.toByteData(format: ImageByteFormat.png); Uint8List pngBytes = byteData.buffer.asUint8List(); где image находится из dart:ui пакета.

Ответ №2:

Вот простое и короткое решение вашей проблемы. Используйте эту строку в своем коде, как я:

 "SettableMetadata(contentType: "image/jpeg")," 
 

Код:

  if (kIsWeb) {
         await ref.putData(
          await imageFile.readAsBytes(),
           SettableMetadata(contentType: "image/jpeg"),
         );
         url = await ref.getDownloadURL();
         }