A Flutter plugin to detect edges of objects, scan paper, detect corners, and detect rectangles. It allows cropping of the detected object image and returns the path of the cropped image.
- 📱 Cross-platform: Works on both Android and iOS
- 📷 Camera Integration: Live camera scanning with edge detection
- 🖼️ Gallery Support: Process images from device gallery
- ✂️ Smart Cropping: Automatic edge detection and cropping
- 🎨 Image Enhancement: Black and white filter options
- 🔧 Customizable UI: Customizable button titles and labels
- 🛡️ Error Handling: Comprehensive error handling with custom exceptions
- Flutter: >=3.27.0
- Dart: >=3.0.0
- Android: API level 21+ (Android 5.0+)
- iOS: 13.0+
Add this to your package's pubspec.yaml
file:
dependencies:
flutter_edge_detection: ^1.0.0
import 'package:flutter_edge_detection/flutter_edge_detection.dart';
import 'package:path_provider/path_provider.dart';
import 'package:path/path.dart';
// Scan with camera
Future<void> scanWithCamera() async {
try {
final directory = await getApplicationSupportDirectory();
final imagePath = join(
directory.path,
'edge_detection_${DateTime.now().millisecondsSinceEpoch}.jpeg',
);
final success = await FlutterEdgeDetection.detectEdge(
imagePath,
canUseGallery: true,
androidScanTitle: 'Scanning',
androidCropTitle: 'Crop',
androidCropBlackWhiteTitle: 'Black White',
androidCropReset: 'Reset',
);
if (success) {
print('Image saved to: $imagePath');
} else {
print('Scanning was cancelled');
}
} on EdgeDetectionException catch (e) {
print('Error: ${e.message}');
}
}
// Scan from gallery
Future<void> scanFromGallery() async {
try {
final directory = await getApplicationSupportDirectory();
final imagePath = join(
directory.path,
'edge_detection_${DateTime.now().millisecondsSinceEpoch}.jpeg',
);
final success = await FlutterEdgeDetection.detectEdgeFromGallery(
imagePath,
androidCropTitle: 'Crop',
androidCropBlackWhiteTitle: 'Black White',
androidCropReset: 'Reset',
);
if (success) {
print('Image saved to: $imagePath');
} else {
print('Processing was cancelled');
}
} on EdgeDetectionException catch (e) {
print('Error: ${e.message}');
}
}
The plugin provides custom exceptions for better error handling:
try {
await FlutterEdgeDetection.detectEdge(imagePath);
} on EdgeDetectionException catch (e) {
print('Error Code: ${e.code}');
print('Error Message: ${e.message}');
print('Error Details: ${e.details}');
} catch (e) {
print('Unexpected error: $e');
}
Scans an object using the camera with edge detection.
Parameters:
saveTo
(String): The file path where the cropped image will be savedcanUseGallery
(bool, optional): Whether to allow switching to gallery mode (default: true)androidScanTitle
(String, optional): Title for the scan screen on Android (default: "Scanning")androidCropTitle
(String, optional): Title for the crop button on Android (default: "Crop")androidCropBlackWhiteTitle
(String, optional): Title for the black/white filter button on Android (default: "Black White")androidCropReset
(String, optional): Title for the reset button on Android (default: "Reset")
Returns: Future<bool>
- true
if successful, false
if cancelled
Processes an image from the gallery with edge detection.
Parameters:
saveTo
(String): The file path where the cropped image will be savedandroidCropTitle
(String, optional): Title for the crop button on Android (default: "Crop")androidCropBlackWhiteTitle
(String, optional): Title for the black/white filter button on Android (default: "Black White")androidCropReset
(String, optional): Title for the reset button on Android (default: "Reset")
Returns: Future<bool>
- true
if successful, false
if cancelled
Custom exception thrown when edge detection operations fail.
Properties:
code
(String): The error codemessage
(String): The error messagedetails
(dynamic): Additional error details
Add the following permissions to your android/app/src/main/AndroidManifest.xml
:
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
Add the following keys to your ios/Runner/Info.plist
:
<key>NSCameraUsageDescription</key>
<string>This app needs camera access to scan documents</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>This app needs photo library access to select images for scanning</string>
See the example/
directory for a complete working example.
- Fork the repository
- Create your feature branch (
git checkout -b feature/amazing-feature
) - Commit your changes (
git commit -m 'Add some amazing feature'
) - Push to the branch (
git push origin feature/amazing-feature
) - Open a Pull Request
This project is licensed under the MIT License - see the LICENSE file for details.
See CHANGELOG.md for a list of changes.
If you encounter any issues or have questions, please file an issue on the GitHub repository.