如何从Flutter中的位图裁剪圆形(或Square或Hexagon)区域

问题描述 投票:0回答:3

我要裁剪矩形图像文件,使其为圆形,正方形或六边形,然后将其另存为图像文件本地。我有一个位图,我想从该位图裁剪圆形或六边形区域。圆外的所有像素均应透明。我该怎么办?

enter image description here

我在android平台中发现了类似的问题。 但是无法找到真正有助于或指导我实现目标的良好资源。请分享给我实现此结果的想法。

image-processing flutter dart flutter-layout flutter-test
3个回答

0
投票

使用Clipper裁剪图像使用ClipRRect,ClipOval,还可以使用自定义Clipper将自定义形状呈现给图像检查此链接https://www.woolha.com/tutorials/flutter-using-clipper-examples

new ClipRRect(
borderRadius: new BorderRadius.circular(8.0),
child: your image child,


0
投票

这些简单的步骤将获得所需的结果。

  1. 创建PictureRecorder
  2. PictureRecorder创建一个[[Canvas。
  3. 使用
  4. canvas.drawCircle()。在画布中绘制圆。
  5. 在PictureRecorder上调用
  6. endRecording()
  7. 以获得图片。在图片上调用
  8. toImage()
  9. 转换图像
  10. toByteData()
  11. 使用
  12. getApplicationDocumentsDirectory()保存图像本地

画布屏幕

enter image description here

将图像画布另存为png

enter image description here

完整源代码:

import 'dart:io'; import 'package:flutter/material.dart'; import 'dart:ui' as ui; import 'package:flutter/services.dart' show rootBundle; import 'dart:async'; import 'dart:typed_data'; import 'dart:math' as math; import 'package:path/path.dart'; import 'package:path_provider/path_provider.dart'; class CustomImageCanvas extends StatefulWidget { CustomImageCanvas({Key key, this.title}) : super(key: key); final String title; @override _CustomImageCanvasState createState() => _CustomImageCanvasState(); } class _CustomImageCanvasState extends State<CustomImageCanvas> { ui.Image image; bool isImageloaded = false; void initState() { super.initState(); init(); } Future<Null> init() async { final ByteData data = await rootBundle.load('assets/image.jpeg'); image = await loadImage(Uint8List.view(data.buffer)); } Future<ui.Image> loadImage(List<int> img) async { final Completer<ui.Image> completer = Completer(); ui.decodeImageFromList(img, (ui.Image img) { setState(() { isImageloaded = true; }); return completer.complete(img); }); return completer.future; } Widget _buildImage() { if (this.isImageloaded) { return CustomPaint( painter: PngImagePainter(image: image), ); } else { return Center(child: Text('loading')); } } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text(widget.title), ), body: Container( child: _buildImage(), )); } } class PngImagePainter extends CustomPainter { PngImagePainter({ this.image, }); ui.Image image; @override void paint(Canvas canvas, Size size) { _drawCanvas(size, canvas); _saveCanvas(size); } Canvas _drawCanvas(Size size, Canvas canvas) { final center = Offset(150, 50); final radius = math.min(size.width, size.height) / 8; // The circle should be paint before or it will be hidden by the path Paint paintCircle = Paint()..color = Colors.black; Paint paintBorder = Paint() ..color = Colors.white ..strokeWidth = size.width / 36 ..style = PaintingStyle.stroke; canvas.drawCircle(center, radius, paintCircle); canvas.drawCircle(center, radius, paintBorder); double drawImageWidth = 0; var drawImageHeight = -size.height * 0.8; Path path = Path() ..addOval(Rect.fromLTWH(drawImageWidth, drawImageHeight, image.width.toDouble(), image.height.toDouble())); canvas.clipPath(path); canvas.drawImage(image, Offset(drawImageWidth, drawImageHeight), Paint()); return canvas; } _saveCanvas(Size size) async { var pictureRecorder = ui.PictureRecorder(); var canvas = Canvas(pictureRecorder); var paint = Paint(); paint.isAntiAlias = true; _drawCanvas(size, canvas); var pic = pictureRecorder.endRecording(); ui.Image img = await pic.toImage(image.width, image.height); var byteData = await img.toByteData(format: ui.ImageByteFormat.png); var buffer = byteData.buffer.asUint8List(); // var response = await get(imgUrl); var documentDirectory = await getApplicationDocumentsDirectory(); File file = File(join(documentDirectory.path, '${DateTime.now().toUtc().toIso8601String()}.png')); file.writeAsBytesSync(buffer); print(file.path); } @override bool shouldRepaint(CustomPainter oldDelegate) { return false; } }
© www.soinside.com 2019 - 2024. All rights reserved.