Невозможно нарисовать изображение на холсте Flutter
В настоящее время я пытаюсь нарисовать изображение на холсте флаттера, а затем нарисовать прямоугольники поверх изображения, чтобы покрыть определенные данные. Я столкнулся с проблемой, когда прямоугольники рисуются нормально, но изображение не отображается. Кажется, будто его вообще не рисуют.
Я загружаю изображение в объект Dart UI Image из байтов. После загрузки изображения я создаю PictureRecorder и передаю его в объект Canvas. Затем я пытаюсь сначала нарисовать объект изображения, а затем прямоугольники сверху. Полный код приведен ниже:
import 'dart:async';
import 'dart:typed_data';
import 'dart:ui' as ui;
import 'package:common/ocr/scraped_card_field.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
class ObfuscatedCardRenderer {
ui.Image _backgroundImage;
///
///
///
Future<ByteData> renderImage(
Uint8List imageBytes, List<ScrapedCardField> fields) async {
await _loadImageBackground(imageBytes);
var obfuscatedImage = await _obfuscateImage(fields);
var byteD =
await obfuscatedImage.toByteData(format: ui.ImageByteFormat.png);
return byteD;
}
///
///
///
Future<ui.Image> _obfuscateImage(List<ScrapedCardField> fields) async {
ui.PictureRecorder recorder = ui.PictureRecorder();
ui.Canvas c = ui.Canvas(recorder);
var paint = ui.Paint();
c.drawImage(_backgroundImage, ui.Offset(0.0, 0.0), new Paint());
for (ScrapedCardField field in fields) {
paint.color = Colors.white;
c.drawRect(field.boundingBox, paint);
}
var picture = recorder.endRecording();
return picture.toImage(_backgroundImage.width, _backgroundImage.height);
}
///
///
///
Future<void> _loadImageBackground(Uint8List imageBytes) async {
if (imageBytes != null) {
_backgroundImage = await _getImageFromBytes(imageBytes);
} else {
return null;
}
}
///
///
///
Future<ui.Image> _getImageFromBytes(Uint8List imageBytes) async {
var completer = Completer<ui.Image>();
ui.decodeImageFromList(imageBytes, (image) {
completer.complete(image);
});
return completer.future;
}
}
Вот результат:
Как видите, прямоугольники нарисованы отлично, однако изображение на заднем плане не видно. Что еще мне нужно сделать, чтобы нарисовать изображение, или есть другой способ сделать это?
Спасибо!
1 ответ
Ниже я публикую рабочий код из моего приложения, которое загружает изображение и показывает его на холсте flutter. Надеюсь, это поможет будущим читателям.
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'dart:ui' as ui;
class ImageInsideCanvasPage extends StatefulWidget {
@override
_ImageInsideCanvasPageState createState() => _ImageInsideCanvasPageState();
}
class _ImageInsideCanvasPageState extends State<ImageInsideCanvasPage> {
ui.Image? image;
@override
void initState() {
// Add your own asset image link
_load('assets/img.png');
super.initState();
}
void _load(String path) async {
var bytes = await rootBundle.load(path);
image = await decodeImageFromList(bytes.buffer.asUint8List());
setState(() {});
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: Container(
child: CustomPaint(
painter: ImageInsideCanvas(image: image),
child: SizedBox.expand(),
),
),
),
);
}
}
class ImageInsideCanvas extends CustomPainter {
ImageInsideCanvas({required this.image});
ui.Image? image;
@override
void paint(Canvas canvas, Size size) async {
Paint greenBrush = Paint()..color = Colors.greenAccent;
canvas.save();
canvas.drawImage(image!, Offset(0, 0), greenBrush);
canvas.restore();
}
@override
bool shouldRepaint(covariant CustomPainter oldDelegate) {
return true;
}
}