Для того же изображение размером 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 МБ (в индексных цветах)? 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
Мобильная версия