Skip to content
Permalink
Branch: master
Find file Copy path
1 contributor

Users who have contributed to this file

179 lines (158 sloc) 5.2 KB
import 'dart:async';
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:image_picker/image_picker.dart';
import 'package:mlkit/mlkit.dart';
void main() => runApp(new MyApp());
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => new _MyAppState();
}
class _MyAppState extends State<MyApp> {
File _file;
List<VisionText> _currentLabels = <VisionText>[];
FirebaseVisionTextDetector detector = FirebaseVisionTextDetector.instance;
@override
initState() {
super.initState();
}
@override
Widget build(BuildContext context) {
return new MaterialApp(
home: new Scaffold(
appBar: new AppBar(
title: new Text('Text recognition from image'),
),
body: _buildBody(),
floatingActionButton: new FloatingActionButton(
onPressed: () async {
try {
//var file = await ImagePicker.pickImage(source: ImageSource.camera);
var file =
await ImagePicker.pickImage(source: ImageSource.gallery);
setState(() {
_file = file;
});
try {
var currentLabels = await detector.detectFromPath(_file?.path);
setState(() {
_currentLabels = currentLabels;
});
} catch (e) {
print(e.toString());
}
} catch (e) {
print(e.toString());
}
},
child: new Icon(Icons.camera),
),
),
);
}
Widget _buildImage() {
return SizedBox(
height: 500.0,
child: new Center(
child: _file == null
? Text('No Image')
: new FutureBuilder<Size>(
future: _getImageSize(Image.file(_file, fit: BoxFit.fitWidth)),
builder: (BuildContext context, AsyncSnapshot<Size> snapshot) {
if (snapshot.hasData) {
return Container(
foregroundDecoration:
TextDetectDecoration(_currentLabels, snapshot.data),
child: Image.file(_file, fit: BoxFit.fitWidth));
} else {
return new Text('Detecting...');
}
},
),
),
);
}
Future<Size> _getImageSize(Image image) {
Completer<Size> completer = new Completer<Size>();
image.image.resolve(new ImageConfiguration()).addListener(
(ImageInfo info, bool _) => completer.complete(
Size(info.image.width.toDouble(), info.image.height.toDouble())));
return completer.future;
}
Widget _buildBody() {
return Container(
child: Column(
children: <Widget>[
_buildImage(),
_buildList(_currentLabels),
],
),
);
}
Widget _buildList(List<VisionText> texts) {
if (texts.length == 0) {
return Text('Empty');
}
return Expanded(
child: Container(
child: ListView.builder(
padding: const EdgeInsets.all(1.0),
itemCount: texts.length,
itemBuilder: (context, i) {
return _buildRow(texts[i].text);
}),
),
);
}
Widget _buildRow(String text) {
return ListTile(
title: Text(
"Text: ${text}",
),
dense: true,
);
}
}
class TextDetectDecoration extends Decoration {
final Size _originalImageSize;
final List<VisionText> _texts;
TextDetectDecoration(List<VisionText> texts, Size originalImageSize)
: _texts = texts,
_originalImageSize = originalImageSize;
@override
BoxPainter createBoxPainter([VoidCallback onChanged]) {
return new _TextDetectPainter(_texts, _originalImageSize);
}
}
class _TextDetectPainter extends BoxPainter {
final List<VisionText> _texts;
final Size _originalImageSize;
_TextDetectPainter(texts, originalImageSize)
: _texts = texts,
_originalImageSize = originalImageSize;
@override
void paint(Canvas canvas, Offset offset, ImageConfiguration configuration) {
final paint = new Paint()
..strokeWidth = 2.0
..color = Colors.red
..style = PaintingStyle.stroke;
// print("original Image Size : ${_originalImageSize}");
final _heightRatio = _originalImageSize.height / configuration.size.height;
final _widthRatio = _originalImageSize.width / configuration.size.width;
for (var text in _texts) {
// print("text : ${text.text}, rect : ${text.rect}");
final _rect = Rect.fromLTRB(
offset.dx + text.rect.left / _widthRatio,
offset.dy + text.rect.top / _heightRatio,
offset.dx + text.rect.right / _widthRatio,
offset.dy + text.rect.bottom / _heightRatio);
// print("_rect : ${_rect}");
canvas.drawRect(_rect, paint);
}
// print("offset : ${offset}");
// print("configuration : ${configuration}");
final rect = offset & configuration.size;
// print("rect container : ${rect}");
canvas.restore();
}
}
You can’t perform that action at this time.