native_image_compress 0.3.2
native_image_compress: ^0.3.2 copied to clipboard
Compress images to JPEG, PNG, WebP, HEIC, or AVIF using the platform's native encoders.
example/lib/main.dart
import 'dart:typed_data';
import 'package:flutter/material.dart';
import 'package:image_picker/image_picker.dart';
import 'package:native_image_compress/image_compress.dart';
import 'advanced_page.dart';
void main() => runApp(const MyApp());
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) =>
const MaterialApp(home: QuickStartPage());
}
class QuickStartPage extends StatefulWidget {
const QuickStartPage({super.key});
@override
State<QuickStartPage> createState() => _QuickStartPageState();
}
class _QuickStartPageState extends State<QuickStartPage> {
Uint8List? _original;
Uint8List? _compressed;
Future<void> _pickAndCompress() async {
final picked = await ImagePicker().pickImage(source: ImageSource.gallery);
if (picked == null) return;
final original = await picked.readAsBytes();
final compressed = await compressToJpeg(original, quality: 80);
setState(() {
_original = original;
_compressed = compressed;
});
}
@override
Widget build(BuildContext context) {
final original = _original;
final compressed = _compressed;
return Scaffold(
appBar: AppBar(
title: const Text('native_image_compress'),
actions: [
IconButton(
icon: const Icon(Icons.tune),
tooltip: 'Advanced example',
onPressed: () => Navigator.of(context).push(
MaterialPageRoute(builder: (_) => const AdvancedPage()),
),
),
],
),
body: Center(
child: Padding(
padding: const EdgeInsets.all(24),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
FilledButton.icon(
onPressed: _pickAndCompress,
icon: const Icon(Icons.image),
label: const Text('Pick & compress'),
),
if (compressed != null && original != null) ...[
const SizedBox(height: 24),
Image.memory(compressed, height: 220),
const SizedBox(height: 12),
Text('${original.length ~/ 1024} KB → ${compressed.length ~/ 1024} KB'),
],
],
),
),
),
);
}
}