54 lines
2.1 KiB
Dart
54 lines
2.1 KiB
Dart
import 'package:google_mlkit_document_scanner/google_mlkit_document_scanner.dart';
|
|
|
|
/// Résultat du scan de document.
|
|
class DocumentScanResult {
|
|
/// Chemin de l'image redressée (de face), ou null si l'utilisateur a annulé.
|
|
final String? imagePath;
|
|
|
|
/// true si un scan a bien été produit.
|
|
bool get success => imagePath != null;
|
|
|
|
const DocumentScanResult(this.imagePath);
|
|
}
|
|
|
|
/// Service qui lance le scanner de documents Google ML Kit.
|
|
///
|
|
/// Le scanner ouvre une UI plein écran fournie par Google Play Services :
|
|
/// caméra, détection des bords de la feuille en direct, recadrage manuel des
|
|
/// 4 coins, puis renvoie l'image REDRESSÉE de face. Idéal pour une cible de
|
|
/// tir, qui est imprimée sur un carton/feuille rectangulaire.
|
|
///
|
|
/// NOTE : disponible uniquement sur Android (fonctionnalité ML Kit en bêta).
|
|
class DocumentScannerService {
|
|
/// Lance le scanner et renvoie le chemin de l'image redressée.
|
|
///
|
|
/// [pageLimit] est fixé à 1 (une seule cible par scan).
|
|
/// On désactive l'import galerie ici car la galerie est gérée séparément.
|
|
///
|
|
/// IMPORTANT : on utilise [ScannerMode.base] et NON [ScannerMode.full].
|
|
/// - `full`/`filter` appliquent des filtres "document" (noir & blanc,
|
|
/// rehaussement type photocopie) → détruit les couleurs de la cible.
|
|
/// - `base` ne fait QUE le recadrage + le redressement de perspective
|
|
/// (mise de face), en conservant l'image en couleurs réelles. C'est
|
|
/// indispensable pour pouvoir détecter ensuite les impacts.
|
|
Future<DocumentScanResult> scanTarget() async {
|
|
final options = DocumentScannerOptions(
|
|
mode: ScannerMode.base, // redressement seul, sans filtre couleur
|
|
pageLimit: 1,
|
|
isGalleryImport: false,
|
|
);
|
|
|
|
final scanner = DocumentScanner(options: options);
|
|
try {
|
|
final DocumentScanningResult result = await scanner.scanDocument();
|
|
final images = result.images;
|
|
if (images.isEmpty) {
|
|
return const DocumentScanResult(null);
|
|
}
|
|
return DocumentScanResult(images.first);
|
|
} finally {
|
|
// Libère les ressources natives du scanner.
|
|
await scanner.close();
|
|
}
|
|
}
|
|
} |