Flutter — сохранение в файл изображения в формате PNG 8.Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Flutter — сохранение в файл изображения в формате PNG 8.

Сообщение Anonymous »

Изображения в формате PNG могут быть: 8 бит (индексные цвета — до 256 цветов) и 24 бита (в пространстве RGB — до 256^3 цветов).
Для того же изображение размером 1000х1000 пикселей, у меня есть два файла размером - 8 бит (0,917 МБт) и 24 бит (2,33 МБт).
Мне нужно записать изображения с наименьшим размером файла (с размером файла до до 256 цветов и 100% качества). Наименьший размер соответствует 8-битному формату PNG (с GIF и JPG размер файла намного больше).
В моем коде Flutter:
  • Оба изображения PNG (8 и 24 бита) загружаются нормально.
  • Скачанное 24-битное изображение записывается нормально - размер файла сохранения 2,31 МБт ( это нормально).
  • Но при сохранении загруженного 8-битного изображения я получаю файл размером 2,05 МБ с изображением в пространстве RGB (не индексными цветами).
Что и как мне исправить мой код Flutter для записи (сохранения) моего 8-битного PNG-изображения, чтобы размер файла составлял ~ 1,0 МБ (в индексных цветах)?
Что и как мне следует исправить в моем коде Flutter, чтобы он записывал (сохранял) мое 8-битное изображение PNG, чтобы размер файла составлял ~ 1,0 МБ (в индексных цветах)? p>
В Интернете я не нашел ничего полезного по своему вопросу. Заранее благодарим за любую помощь или ссылку, и особенно за полный рабочий код.
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'dart:ui' as ui;
import 'dart:io';

Future main() async {
WidgetsFlutterBinding.ensureInitialized();
// Load Image
final ui.Image image = await loadImage("assets/images/image_8_bit.png");
// Save image
await saveImage(image, "assets/images/image_8_bit__save.png");
}

Future loadImage(String imagePath) async {
final ByteData byteData = await rootBundle.load(imagePath);
final Uint8List imageData = byteData.buffer.asUint8List();
final ui.Codec codec = await ui.instantiateImageCodec(imageData);
final ui.FrameInfo frameInfo = await codec.getNextFrame();
return frameInfo.image;
}

Future saveImage(ui.Image image, String filename) async {
final ByteData? byteData =
await image.toByteData(format: ui.ImageByteFormat.png);
final Uint8List pngBytes = byteData!.buffer.asUint8List();

await File(filename).writeAsBytes(pngBytes);
}


Подробнее здесь: https://stackoverflow.com/questions/781 ... g-8-format
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»