flutter_image_compress_linux 0.1.0
flutter_image_compress_linux: ^0.1.0 copied to clipboard
The implementation of Linux for flutter_image_compress. Uses dart:ffi with native C codecs for JPEG, PNG, WebP, and HEIC compression.
import 'dart:io';
import 'dart:typed_data';
import 'package:flutter/material.dart';
import 'package:flutter_image_compress_linux/flutter_image_compress_linux.dart';
import 'package:flutter_image_compress_platform_interface/flutter_image_compress_platform_interface.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Image Compress Linux Example',
theme: ThemeData(primarySwatch: Colors.blue),
home: const CompressDemo(),
);
}
}
class CompressDemo extends StatefulWidget {
const CompressDemo({super.key});
@override
State<CompressDemo> createState() => _CompressDemoState();
}
class _CompressDemoState extends State<CompressDemo> {
String _status = 'Tap a button to compress an image';
Uint8List? _compressedBytes;
@override
void initState() {
super.initState();
// Ensure the Linux platform is registered
FlutterImageCompressLinux.registerWith();
}
Future<void> _compressFromMemory() async {
setState(() => _status = 'Compressing...');
try {
// Create a simple test image (red 100x100 PNG)
final original = await _createTestPng();
final compressed = await FlutterImageCompressPlatform.instance
.compressWithList(
original,
quality: 70,
format: CompressFormat.jpeg,
minWidth: 50,
minHeight: 50,
);
setState(() {
_compressedBytes = compressed;
_status = 'Original: ${original.length} bytes → '
'Compressed: ${compressed.length} bytes (JPEG q70)';
});
} catch (e) {
setState(() => _status = 'Error: $e');
}
}
Future<void> _compressToFile() async {
setState(() => _status = 'Compressing to file...');
try {
final original = await _createTestPng();
final tmpIn = File('/tmp/flutter_compress_test_input.png');
final tmpOut = '/tmp/flutter_compress_test_output.jpg';
await tmpIn.writeAsBytes(original);
final result = await FlutterImageCompressPlatform.instance
.compressAndGetFile(
tmpIn.path,
tmpOut,
quality: 80,
format: CompressFormat.jpeg,
);
if (result != null) {
final outSize = await File(result.path).length();
setState(() {
_status = 'Saved to: ${result.path} ($outSize bytes)';
});
} else {
setState(() => _status = 'Compression returned null');
}
} catch (e) {
setState(() => _status = 'Error: $e');
}
}
/// Creates a minimal valid PNG in memory for testing.
Future<Uint8List> _createTestPng() async {
// Use a simple 2x2 red PNG (minimal valid PNG file)
return Uint8List.fromList([
0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, // PNG signature
0x00, 0x00, 0x00, 0x0D, 0x49, 0x48, 0x44, 0x52, // IHDR chunk
0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, // 2x2
0x08, 0x02, 0x00, 0x00, 0x00, 0xFD, 0xD4, 0x9A, 0x73, // 8-bit RGB
0x00, 0x00, 0x00, 0x12, 0x49, 0x44, 0x41, 0x54, // IDAT chunk
0x08, 0xD7, 0x63, 0xF8, 0xCF, 0xC0, 0x00, 0x00, // compressed data
0x00, 0x02, 0x00, 0x01, 0xE2, 0x21, 0xBC, 0x33, // (red pixels)
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4E, 0x44, // IEND chunk
0xAE, 0x42, 0x60, 0x82,
]);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('Image Compress Linux')),
body: Padding(
padding: const EdgeInsets.all(16),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(_status, style: Theme.of(context).textTheme.bodyLarge),
const SizedBox(height: 24),
ElevatedButton(
onPressed: _compressFromMemory,
child: const Text('Compress in memory (PNG → JPEG)'),
),
const SizedBox(height: 12),
ElevatedButton(
onPressed: _compressToFile,
child: const Text('Compress to file'),
),
const SizedBox(height: 24),
if (_compressedBytes != null)
Text(
'Compressed image: ${_compressedBytes!.length} bytes',
style: Theme.of(context).textTheme.bodyMedium,
),
],
),
),
);
}
}