#flutter #dart #uint8array #uint8list
#flutter #dart #uint8array #uint8list
Вопрос:
У меня есть несколько списков Uint8, и я хочу сохранить их в виде файлов jpg. Я много искал это в Интернете, но ничего не нашел! Кто-нибудь может помочь?
Спасибо,
Комментарии:
1.
File
у класса fromdart.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();
}