implementation de cunning pour scanner l'image et la redresser

This commit is contained in:
2026-02-13 22:18:35 +01:00
parent 91fcd931e8
commit 7e55c52ae7
12 changed files with 273 additions and 104 deletions

View File

@@ -6,13 +6,13 @@
library;
import 'dart:io';
import 'package:cunning_document_scanner/cunning_document_scanner.dart';
import 'package:flutter/material.dart';
import 'package:image_picker/image_picker.dart';
import '../../core/constants/app_constants.dart';
import '../../core/theme/app_theme.dart';
import '../../data/models/target_type.dart';
import '../crop/crop_screen.dart';
import 'widgets/target_type_selector.dart';
import 'widgets/image_source_button.dart';
class CaptureScreen extends StatefulWidget {
@@ -31,9 +31,7 @@ class _CaptureScreenState extends State<CaptureScreen> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Nouvelle Analyse'),
),
appBar: AppBar(title: const Text('Nouvelle Analyse')),
body: SingleChildScrollView(
padding: const EdgeInsets.all(AppConstants.defaultPadding),
child: Column(
@@ -59,8 +57,8 @@ class _CaptureScreenState extends State<CaptureScreen> {
Expanded(
child: ImageSourceButton(
icon: Icons.camera_alt,
label: 'Camera',
onPressed: _isLoading ? null : () => _captureImage(ImageSource.camera),
label: 'Scanner',
onPressed: _isLoading ? null : _scanDocument,
),
),
const SizedBox(width: 12),
@@ -68,7 +66,9 @@ class _CaptureScreenState extends State<CaptureScreen> {
child: ImageSourceButton(
icon: Icons.photo_library,
label: 'Galerie',
onPressed: _isLoading ? null : () => _captureImage(ImageSource.gallery),
onPressed: _isLoading
? null
: () => _captureImage(ImageSource.gallery),
),
),
],
@@ -87,8 +87,7 @@ class _CaptureScreenState extends State<CaptureScreen> {
_buildImagePreview(),
// Guide text
if (_selectedImagePath == null && !_isLoading)
_buildGuide(),
if (_selectedImagePath == null && !_isLoading) _buildGuide(),
],
),
),
@@ -105,9 +104,9 @@ class _CaptureScreenState extends State<CaptureScreen> {
Widget _buildSectionTitle(String title) {
return Text(
title,
style: Theme.of(context).textTheme.titleMedium?.copyWith(
fontWeight: FontWeight.bold,
),
style: Theme.of(
context,
).textTheme.titleMedium?.copyWith(fontWeight: FontWeight.bold),
);
}
@@ -160,7 +159,9 @@ class _CaptureScreenState extends State<CaptureScreen> {
Expanded(
child: Text(
'Assurez-vous que la cible est bien centree et visible.',
style: TextStyle(color: AppTheme.warningColor.withValues(alpha: 0.8)),
style: TextStyle(
color: AppTheme.warningColor.withValues(alpha: 0.8),
),
),
),
],
@@ -175,20 +176,19 @@ class _CaptureScreenState extends State<CaptureScreen> {
padding: const EdgeInsets.all(AppConstants.defaultPadding),
child: Column(
children: [
Icon(
Icons.help_outline,
size: 48,
color: Colors.grey[400],
),
Icon(Icons.help_outline, size: 48, color: Colors.grey[400]),
const SizedBox(height: 12),
Text(
'Conseils pour une bonne analyse',
style: Theme.of(context).textTheme.titleSmall?.copyWith(
fontWeight: FontWeight.bold,
),
style: Theme.of(
context,
).textTheme.titleSmall?.copyWith(fontWeight: FontWeight.bold),
),
const SizedBox(height: 12),
_buildGuideItem(Icons.crop_free, 'Cadrez la cible entiere dans l\'image'),
_buildGuideItem(
Icons.crop_free,
'Cadrez la cible entiere dans l\'image',
),
_buildGuideItem(Icons.wb_sunny, 'Utilisez un bon eclairage'),
_buildGuideItem(Icons.straighten, 'Prenez la photo de face'),
_buildGuideItem(Icons.blur_off, 'Evitez les images floues'),
@@ -211,6 +211,31 @@ class _CaptureScreenState extends State<CaptureScreen> {
);
}
Future<void> _scanDocument() async {
setState(() => _isLoading = true);
try {
final List<String>? pictures = await CunningDocumentScanner.getPictures();
if (pictures != null && pictures.isNotEmpty) {
setState(() => _selectedImagePath = pictures.first);
}
} catch (e) {
if (mounted) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text('Erreur lors du scan: $e'),
backgroundColor: AppTheme.errorColor,
),
);
}
} finally {
if (mounted) {
setState(() => _isLoading = false);
}
}
}
Future<void> _captureImage(ImageSource source) async {
setState(() => _isLoading = true);