Image processing 如何在颤振中从画布裁剪圆形(或方形或六边形)区域

Image processing 如何在颤振中从画布裁剪圆形(或方形或六边形)区域,image-processing,flutter,flutter-layout,flutter-test,flutter-canvas,Image Processing,Flutter,Flutter Layout,Flutter Test,Flutter Canvas,我想裁剪一个矩形的图像文件,使其成为圆形、方形或六边形,然后将其保存为本地图像文件。我有一个位图,我想从这个位图裁剪一个圆形或六边形区域。圆圈外的所有像素都应该是透明的。我该怎么做 我在平台上发现了类似的问题。但无法找到一个好的资源,真正帮助或指导我实现这一点在颤振。请与我分享实现此结果的想法。您可以使用此软件包 您可以使用该软件包 使用裁剪器裁剪图像 使用ClipRRect、ClipOval,您还可以使用自定义裁剪器为图像提供自定义形状 检查此链接 )使用裁剪器裁剪图像 使用ClipRRec

我想裁剪一个矩形的图像文件,使其成为圆形、方形或六边形,然后将其保存为本地图像文件。我有一个位图,我想从这个位图裁剪一个圆形或六边形区域。圆圈外的所有像素都应该是透明的。我该怎么做

我在平台上发现了类似的问题。但无法找到一个好的资源,真正帮助或指导我实现这一点在颤振。请与我分享实现此结果的想法。

您可以使用此软件包

您可以使用该软件包


使用裁剪器裁剪图像 使用ClipRRect、ClipOval,您还可以使用自定义裁剪器为图像提供自定义形状 检查此链接


)

使用裁剪器裁剪图像 使用ClipRRect、ClipOval,您还可以使用自定义裁剪器为图像提供自定义形状 检查此链接


)

这些简单的步骤可以得到所需的结果。

  • 创建一个图片记录器
  • 使用图片记录器创建画布
  • 使用canvas.drawCircle()在画布中绘制圆。
  • 在PictureRecorder上调用endRecording(),以获取图片
  • 对图片调用toImage()
  • 将图像转换为字节数据()
  • 使用getApplicationDocumentsDirectory()本地保存图像
  • 画布屏幕

    将图像画布保存为png

    完整源代码:

            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;
              }
            }
    
    导入'dart:io';
    进口“包装:颤振/材料.省道”;
    将“dart:ui”导入为ui;
    导入“包:flatter/services.dart”显示根包;
    导入“dart:async”;
    导入“dart:键入的_数据”;
    导入'dart:math'作为数学;
    导入“package:path/path.dart”;
    导入“package:path_provider/path_provider.dart”;
    类CustomImageCanvas扩展StatefulWidget{
    CustomImageCanvas({Key-Key,this.title}):超级(Key:Key);
    最后的字符串标题;
    @凌驾
    _CustomImageCanvasState createState()=>_CustomImageCanvasState();
    }
    类\u CustomImageCanvasState扩展状态{
    ui.图像;
    bool-isimageload=false;
    void initState(){
    super.initState();
    init();
    }
    Future init()异步{
    final ByteData data=wait rootBundle.load('assets/image.jpeg');
    image=wait loadImage(Uint8List.view(data.buffer));
    }
    未来加载映像(列表img)异步{
    最终完成者完成者=完成者();
    ui.decodeMageFromList(img,(ui.Image img){
    设置状态(){
    isImageloaded=true;
    });
    返回完成符。完成(img);
    });
    返回completer.future;
    }
    小部件_buildImage(){
    如果(此.isImageloaded){
    返回自定义油漆(
    画家:PngImagePainter(图像:图像),
    );
    }否则{
    返回中心(子项:文本(“加载”);
    }
    }
    @凌驾
    小部件构建(构建上下文){
    返回脚手架(
    appBar:appBar(
    标题:文本(widget.title),
    ),
    主体:容器(
    子项:_buildImage(),
    ));
    }
    }
    类PngImagePainter扩展了CustomPainter{
    油漆工({
    这个,这个形象,,
    });
    ui.图像;
    @凌驾
    空心油漆(帆布,尺寸){
    _帆布(尺寸、帆布);
    _保存画布(大小);
    }
    Canvas\u drawCanvas(尺寸、画布){
    最终中心=偏移量(150,50);
    最终半径=数学最小值(尺寸、宽度、尺寸、高度)/8;
    //应在绘制之前绘制圆,否则它将被路径隐藏
    绘制画圈=绘制()…颜色=颜色。黑色;
    Paint paintBorder=Paint()
    …颜色=颜色。白色
    ..冲程宽度=尺寸宽度/36
    ..风格=绘画风格.笔划;
    画布.画圈(中心、半径、画圈);
    画布.画圈(中心、半径、画框);
    双drawImageWidth=0;
    var drawImageHeight=-size.height*0.8;
    路径路径=路径()
    …添加椭圆形(垂直于LTWH(drawImageWidth,drawImageHeight,
    image.width.toDouble(),image.height.toDouble();
    canvas.clipPath(路径);
    drawImage(图像,偏移量(drawImageWidth,drawImageHeight),Paint());
    返回画布;
    }
    _saveCanvas(大小)异步{
    var pictureRecorder=ui.pictureRecorder();
    var canvas=画布(pictureRecorder);
    var paint=paint();
    paint.Isatarias=真;
    _帆布(尺寸、帆布);
    var pic=pictureRecorder.endRecording();
    ui.Image img=wait pic.toImage(Image.width,Image.height);
    var byteData=wait img.toByteData(格式:ui.ImageByteFormat.png);
    var buffer=byteData.buffer.asUint8List();
    //var响应=等待获取(imgUrl);
    var documentDirectory=等待getApplicationDocumentsDirectory();
    文件=文件(join(documentDirectory.path,
    “${DateTime.now().toUtc().toIso8601String()}.png');
    writeAsBytesSync文件(缓冲区);
    打印(file.path);
    }
    @凌驾
    bool应重新绘制(自定义代理){
    返回false;
    }
    
            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;
              }
            }