ui_image.dart 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. import 'dart:math';
  2. import 'package:flutter/material.dart';
  3. import 'dart:ui' as ui;
  4. import 'package:logging/logging.dart';
  5. final Logger _log = Logger('ui_image.dart');
  6. class UIImage extends StatelessWidget {
  7. final ui.Image image;
  8. final Size size;
  9. const UIImage({super.key, required this.image, this.size = Size.infinite});
  10. @override
  11. Widget build(BuildContext context) {
  12. return CustomPaint(
  13. size: size,
  14. painter: _UIImagePainter(image: image),
  15. );
  16. }
  17. }
  18. class _UIImagePainter extends CustomPainter {
  19. final ui.Image image;
  20. _UIImagePainter({required this.image});
  21. Rect getRect(Rect content, Rect canvas) {
  22. double scale = min(content.width / canvas.width, content.height / canvas.height);
  23. Rect rect = Rect.fromLTWH(0, 0, canvas.width * scale, canvas.height * scale);
  24. Offset offset = content.center - rect.center;
  25. return rect.shift(offset);
  26. }
  27. @override
  28. void paint(Canvas canvas, Size size) {
  29. Rect content = Rect.fromLTWH(0, 0, image.width.toDouble(), image.height.toDouble());
  30. Rect canvasRect = Rect.fromLTWH(0, 0, size.width, size.height);
  31. try {
  32. canvas.drawImageRect(image, getRect(content, canvasRect), canvasRect, Paint());
  33. } catch (e) {
  34. _log.warning(e);
  35. }
  36. }
  37. @override
  38. bool shouldRepaint(covariant CustomPainter oldDelegate) {
  39. return true;
  40. }
  41. }