-
-
Save netsmertia/9c588f23391c781fa1eb791f0dce0768 to your computer and use it in GitHub Desktop.
| import 'package:flutter/material.dart'; | |
| import 'dart:ui' as ui; | |
| import 'package:flutter/services.dart' show rootBundle; | |
| import 'dart:async'; | |
| import 'dart:typed_data'; | |
| void main() => runApp(new MyApp()); | |
| class MyApp extends StatelessWidget { | |
| // This widget is the root of your application. | |
| @override | |
| Widget build(BuildContext context) { | |
| return new MaterialApp( | |
| title: 'Flutter Demo', | |
| theme: new ThemeData( | |
| primarySwatch: Colors.blue, | |
| ), | |
| home: new MyHomePage(title: 'Flutter Demo Home Page'), | |
| ); | |
| } | |
| } | |
| class MyHomePage extends StatefulWidget { | |
| MyHomePage({Key key, this.title}) : super(key: key); | |
| final String title; | |
| @override | |
| _MyHomePageState createState() => new _MyHomePageState(); | |
| } | |
| class _MyHomePageState extends State<MyHomePage> { | |
| ui.Image image; | |
| bool isImageloaded = false; | |
| void initState() { | |
| super.initState(); | |
| init(); | |
| } | |
| Future <Null> init() async { | |
| final ByteData data = await rootBundle.load('images/lake.jpg'); | |
| image = await loadImage(new Uint8List.view(data.buffer)); | |
| } | |
| Future<ui.Image> loadImage(List<int> img) async { | |
| final Completer<ui.Image> completer = new Completer(); | |
| ui.decodeImageFromList(img, (ui.Image img) { | |
| setState(() { | |
| isImageloaded = true; | |
| }); | |
| return completer.complete(img); | |
| }); | |
| return completer.future; | |
| } | |
| Widget _buildImage() { | |
| if (this.isImageloaded) { | |
| return new CustomPaint( | |
| painter: new ImageEditor(image: image), | |
| ); | |
| } else { | |
| return new Center(child: new Text('loading')); | |
| } | |
| } | |
| @override | |
| Widget build(BuildContext context) { | |
| return new Scaffold( | |
| appBar: new AppBar( | |
| title: new Text(widget.title), | |
| ), | |
| body: new Container( | |
| child: _buildImage(), | |
| ) | |
| ); | |
| } | |
| } | |
| class ImageEditor extends CustomPainter { | |
| ImageEditor({ | |
| this.image, | |
| }); | |
| ui.Image image; | |
| @override | |
| void paint(Canvas canvas, Size size) { | |
| ByteData data = image.toByteData(); | |
| canvas.drawImage(image, new Offset(0.0, 0.0), new Paint()); | |
| } | |
| @override | |
| bool shouldRepaint(CustomPainter oldDelegate) { | |
| return false; | |
| } | |
| } |
Where do you put FlutterImageCompress.compressAndGetFile(filePath, rotatePath, minHeight: 480, minWidth: 400, rotate: -90); in which line? what do you mean with target path
thank you very much =)
thank you!!
How to load & draw image independently just on custom painter?
love you
If the image is not an asset image, but a file stored on the device, and its path is known, you can do like this:
Future<ui.Image> loadImage(Uint8List bytes) async {
final Completer<ui.Image> completer = Completer();
ui.decodeImageFromList(bytes, (ui.Image img) {
return completer.complete(img);
});
return completer.future;
}
File file = File(thePath);
Uint8List bytes = await file.readAsBytes();
ui.Image backgroundImage = await loadImage(bytes);
and in the Custom Painter:
canvas.drawImage(backgroundImage, Offset(0.0, 0.0), Paint());
Works with both .png and .jpg files.
how could I change the size of the image?
If the image is not an asset image, but a file stored on the device, and its path is known, you can do like this:
Future<ui.Image> loadImage(Uint8List bytes) async { final Completer<ui.Image> completer = Completer(); ui.decodeImageFromList(bytes, (ui.Image img) { return completer.complete(img); }); return completer.future; } File file = File(thePath); Uint8List bytes = await file.readAsBytes(); ui.Image backgroundImage = await loadImage(bytes);and in the Custom Painter:
canvas.drawImage(backgroundImage, Offset(0.0, 0.0), Paint());Works with both .png and .jpg files.
Thanks a lot!!
hello
after testing your code it seems that something has changed the image loading does not work anymore
these normal?
cdl remy
How can I add the eraser mode on canvas but the eraser should not erase the picture?
This was very helpful. Thank you
thx