美文网首页FlutterFlutterFlutter
Flutter实现图片裁剪

Flutter实现图片裁剪

作者: AJI大侠 | 来源:发表于2019-05-11 16:50 被阅读16次
  • 在这一篇中我们来实现图片的裁剪
  1. 这里我们使用到canvas的drawImageRect()方法
void drawImageRect(Image image, Rect src, Rect dst, Paint paint)
  • 第一个参数Image image为需要image图片(UI.Image类型)
  • 第二个参数Rect src为需要截取的矩形Rect
Rect.fromLTRB(0, 0, width/2, height/2)

意思就是从原图片中截取一个矩形,矩形的坐标从(0.0)到(宽的一半, 高的一半)
fromLTRB是指定left,top,right,bottom坐标,通过指定四个点来获取矩形
第三个为目标矩形Rect,即你想要在canvas上绘制的区域,

  • 第三个参数设置为
Rect.fromLTWH(0, 0, 150, 150)

截取的矩形,在canvas的(0,0)坐标开始绘制,宽和高各为150,
fromLTWH是指定left和top坐标,并设置宽高来获取矩形

  • 第四个参数paint为画笔
  1. 自定义图片裁剪
import 'package:flutter/material.dart';
import 'dart:ui' as ui;

/// 图片裁剪
class ImageClipper extends CustomPainter {
  final ui.Image image;
  final double left;
  final double top;
  final double right;
  final double bottom;

  ImageClipper(this.image,{this.left = 0.3,this.top = 0.3,this.right = 0.6,this.bottom = 0.6});
  @override
  void paint(Canvas canvas, Size size) {
    // TODO: implement paint
    Paint paint = Paint();
    canvas.drawImageRect(
        image,
        Rect.fromLTRB(image.width * left, image.height * top,
            image.width * right, image.height * bottom),
        Rect.fromLTWH(0, 0, size.width, size.height),
        paint);
  }

  @override
  bool shouldRepaint(CustomPainter oldDelegate) {
    // TODO: implement shouldRepaint
    return false;
  }
}
  1. 将图片转化为流,并添加监听,在图片流加载完成之后获取到ui.Image
 Future<ui.Image> _loadImge() async {
    ImageStream imageStream = NetworkImage(pic).resolve(ImageConfiguration());
    Completer<ui.Image> completer = Completer<ui.Image>();
    void imageListener(ImageInfo info, bool synchronousCall) {
      ui.Image image = info.image;
      completer.complete(image);
      imageStream.removeListener(imageListener);
    }
    imageStream.addListener(imageListener);
    return completer.future;
  }

4.得到image之后我们使用自定义的裁剪类代码如下

 clip() async {
    ui.Image uiImage;
    _loadImge().then((image){uiImage = image;}).whenComplete(() {
      clipper = ImageClipper(uiImage);
      setState(() {});
    });
  }
  • 完整代码
import 'package:flutter/material.dart';
import 'package:flutter_trip/util/ImageClipper.dart';
import 'dart:ui' as ui;
import 'dart:async';

const String pic =
    'http://pic75.nipic.com/file/20150821/9448607_145742365000_2.jpg';

class ImageClipperTest extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    // TODO: implement createState
    return _ImageClipperTestState();
  }
}

class _ImageClipperTestState extends State<ImageClipperTest> {
  ImageClipper clipper;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('ImageClipper'),
      ),
      body: Center(
        child: Column(
          children: <Widget>[
            SizedBox(
              child: Container(color: Colors.grey, child: Image.network(pic,fit: BoxFit.fill,)),
              width: 200,
              height: 150,
            ),
            SizedBox(
              height: 50,
            ),
            Container(
                color: Colors.green,
                child: CustomPaint(
                  painter: clipper,
                  size: Size(100, 100),
                )),
            RaisedButton(child: Text('Clip'), onPressed: () => clip())
          ],
        ),
      ),
    );
  }

  Future<ui.Image> _loadImge() async {
    ImageStream imageStream = NetworkImage(pic).resolve(ImageConfiguration());
    Completer<ui.Image> completer = Completer<ui.Image>();
    void imageListener(ImageInfo info, bool synchronousCall) {
      ui.Image image = info.image;
      completer.complete(image);
      imageStream.removeListener(imageListener);
    }

    imageStream.addListener(imageListener);
    return completer.future;
  }

  clip() async {
    ui.Image uiImage;
    _loadImge().then((image){uiImage = image;}).whenComplete(() {
      clipper = ImageClipper(uiImage);
      setState(() {});
    });
  }
}
效果图片

相关文章

  • Flutter实现图片裁剪

    在这一篇中我们来实现图片的裁剪 这里我们使用到canvas的drawImageRect()方法 第一个参数Imag...

  • Flutter裁剪图片

    最近在学习中需要用到裁剪图片,记录一下解决方法 思路: 使用canvas的drawImageRect()方法,对I...

  • flutter 图片裁剪

    上次做了图片裁剪的需求没有记录, 最近遇到了身份证裁剪的需求又忘记处理方法了,处理完毕后记录一下 需求: 根据形状...

  • flutter 图片裁剪、编辑

    //产品需求是 拍照和相册选择照片 然后进入照片编辑页面 完成编辑上传图片 用到的库有image_picker 实...

  • 移动端添加图片裁剪的坑

    本文关键:阻止冒泡、canvas压缩、canvas裁剪、生成黑色图片。 最近项目需要在添加图片时实现裁剪功能,虽然...

  • flutter实现圆角裁剪

    正常情况,大家知道使用Container widget的BoxDecoration可以实现圆角功能,但是如果遇到比...

  • flutter图片裁剪后上传

    裁剪图片 这里推荐flutter 插件:simple_image_crop。用法非常简单,支持圆形和方形选区,支持...

  • Flutter 图片裁剪(相机,相册)

    今天用到了一个特别好用的图片裁剪库,在这里分享一下Copper 先看一下效果图 这个裁剪库还是蛮强的,有左右旋转,...

  • Flutter(二十)ClipOval图片裁剪

    flutter提供的一个裁剪widget

  • 前端实现图片和视频的居中裁剪

    1. 图片裁剪效果 -- 用css可实现 方法:就是把图片作为标签的背景色, css控制图片的位置 2. 视频裁剪...

网友评论

    本文标题:Flutter实现图片裁剪

    本文链接:https://www.haomeiwen.com/subject/aqpaoqtx.html