最近在学习中需要用到裁剪图片,记录一下解决方法

思路:

使用canvas的drawImageRect()方法,对Image进行裁剪,这里的Image需要 'dart:ui' 库中的Image。

1. canvas的drawImageRect()方法

drawImageRect(Image image, Rect src, Rect dst, Paint paint) → void

  

①第一个参数是'dart:ui' 库中的Image。

②第二个参数为你需要截取的矩形Rect,举个栗子:截取一张图片,原图的宽高分别为w和h,

将第二个参数设置为:

Rect.fromLTRB(0, 0, w/2, h/2)

  

意思就是从原图片中截取一个矩形,矩形的坐标从(0.0)到(w/2, h/2)。

这里的是fromLTWH意思是指定left,top,right,bottom坐标,通过指定四个点来获取矩形

③第三个为目标矩形Rect,即你想要在canvas上绘制的区域,

举个栗子:接着上面所讲的,将第三个参数设置为

Rect.fromLTWH(0, 0, 100, 100), paint);

  

意思就是将上面截取的矩形,在canvas的(0,0)坐标开始绘制,绘制的宽和高为100,

这里的是fromLTWH意思是指定left和top坐标,并设置宽高来获取矩形

④第四个参数为画笔。

2.'dart:ui' 库中的Image

这里我们要引入'dart:ui' 取别名为ui,避免库里的方法与'package:flutter/material.dart'中的方法重名冲突

import 'dart:ui' as ui;

  

从我们平常用的图片去获取ui库下的Image的方法如下:

将图片转化为流,并添加监听,在图片流加载完成之后获取到ui.Image

Future<ui.Image> imageLoader() {

    ImageStream imageStream = NetworkImage(

            'https://avatars0.githubusercontent.com/u/45789654?s=460&v=4')

        .resolve(ImageConfiguration.empty);

    Completer<ui.Image> imageCompleter = Completer<ui.Image>();

    void imageListener(ImageInfo info, bool synchronousCall) {

      ui.Image image = info.image;

      imageCompleter.complete(image);

      imageStream.removeListener(imageListener);

    }

    imageStream.addListener(imageListener);

    return imageCompleter.future;

  }

  

clip() async {

    ui.Image _image;

    imageLoader().then((image) => _image = image).whenComplete(() {

      clipper = ImageClipper(_image,left: 0,top: 0,right: 0.5,bottom: 0.5);

      setState(() {});

    });

  }

  

通过clip()方法得到ImageClipper对象,并且setState通知界面更新Container的内容,

Container(color: Colors.green,child: CustomPaint(painter: clipper,size: Size(50, 50),)),

  

ImageClipper中的核心方法

@override

  void paint(Canvas canvas, Size size) {

    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);

  }

  

Flutter裁剪图片的更多相关文章

  1. Java+jquery实现裁剪图片上传到服务器

    大体分两步: 1.利用jquery裁剪图片,把裁剪到的几个点传入后端 2.利用前端传入的几个点,来裁剪图片 首先,用到一个jquery的插件 imgAreaSelect 实例及插件下载地址:http: ...

  2. PHP图片裁剪与缩放 / 无损裁剪图片

    图片太大且规格不统一,显示的控制需要靠JavaScript来完成,用在移动设备上时显示效果不好且流量巨大,需要对现有图片库的图片进行一次处理,生成符合移动设备用的缩略图,将原来客户端JS做的工作转移到 ...

  3. iOS开发——UI进阶篇(十八)核心动画小例子,转盘(裁剪图片、自定义按钮、旋转)图片折叠、音量震动条、倒影、粒子效果

    一.转盘(裁剪图片.自定义按钮.旋转) 1.裁剪图片 将一张大图片裁剪为多张 // CGImageCreateWithImageInRect:用来裁剪图片 // image:需要裁剪的图片 // re ...

  4. IOS 按比例裁剪图片

    拍照或者从图片库中获取图片 操作过程中容易闪退,也总会有内存压力警告,第一步,首先可以考虑裁剪图片,实际上可能不需要那么大的.其次可以考虑把耗时的比如存储过程放进线程. 这里封装裁剪图片的类方法. / ...

  5. HTML5 本地裁剪图片

    下面奉上我自己写的一个demo,代码写得比较少,很多细节不会处理.如果有不得当的地方恳请指教,谢谢啦 ^_^ ^_^   功能实现步奏:   一:获取文件,读取文件并生成url   二:根据容器的大小 ...

  6. PHP裁剪图片

    PHP裁剪图片 $src_path = '1.jpg'; //创建源图的实例 $src = imagecreatefromstring(file_get_contents($src_path)); / ...

  7. iOS 压缩与裁剪图片问题

    我们假设要在截图中的举行图片展示区显示图片,由于原图片的宽高比例与图片显示窗口的宽高比例不一定相同,所以,直接将图片扔进去会改变图片的宽高比例,展示效果不好. 这时你可能想到设置UIImageView ...

  8. HTML5 本地裁剪图片并上传至服务器(转)

    很多情况下用户上传的图片都需要经过裁剪,比如头像啊什么的.但以前实现这类需求都很复杂,往往需要先把图片上传到服务器,然后返回给用户,让用户确定裁剪坐标,发送给服务器,服务器裁剪完再返回给用户,来回需要 ...

  9. Windows Phone – 裁剪图片 (Crop Image)

    原文:Windows Phone – 裁剪图片 (Crop Image) 最近在处理图像的功能,对於图像的比例我也不是非常的清楚,因此,在编辑图片上花了不少时间. 该篇文章主要说明的是:如何对图片选择 ...

随机推荐

  1. docker_概念

    为什么有docker? 1. 宿主机可以虚拟一个硬件平台:其上会有内核(在虚拟机上的操作系统),内核负责资源调度和通信:内核之上会有用户态,运行在用户态(用户空间)之上多是应用程序,也就是进程.硬件( ...

  2. ERROR: source database "template1" is being accessed by other users

    一开始,开发童鞋说他在测试环境没有创建数据库的权限.心想,不对呀,开发环境没有怎么做权限管控,明明给予授权了.上来一看: postgres=# CREATE DATABASE "abce&q ...

  3. 解决VS Code开发Python3语言自动补全功能

    1.打开设置界面 2)使用快捷键组合[Ctrl+Shift+p] . 输入setting,选中首选项的user setting模式设置界面 在打开的User Settings文件界面,搜索:pytho ...

  4. Nginx 必须知道哪些事?

    Nginx(发音同engine x)是一个异步框架的 Web 服务器,也可以用作反向代理,负载平衡器 和 HTTP 缓存.该软件由 Igor Sysoev 创建,并于2004年首次公开发布.同名公司成 ...

  5. asp.net core mvc 读取appsettings.config中文乱码问题

    asp.net core mvc 读取appsettings.config中文乱码问题的解决方法如下: 用记事本打开appsettings.config,另存为的时候,编码设置为 “UTF-8”,

  6. uni-app v-for循环遍历 动态切换class、动态切换style

    动态切换class,主要代码::class="i.themColor"  <view v-for="i in htmlJSON" class=" ...

  7. SpringBoot 使用AOP记录接口访问日志

    文章来源:https://macrozheng.github.io/mall-learning/#/technology/aop_log AOP AOP为Aspect Oriented Program ...

  8. 【414 error】nginx GET请求过长导致414错误

    server{ ... } 在上面一段配置中添加如下两行 client_header_buffer_size 5120k; large_client_header_buffers 5120k; 并重启 ...

  9. 【SSH进阶之路】Hibernate映射——多对多关联映射(八)

    上篇博文[SSH进阶之路]Hibernate映射——一对多关联映射(七),我们介绍了一对多关联映射,它是多对多关联映射的基础. 多对多映射是现实生活中最常见的映射,也是最容易理解的映射.废话少说,直接 ...

  10. libevent实现对管道的读写操作

    读管道: #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <sys/t ...