gif动图的裁剪实现思路

项目需求(对app的轮播,以及banner和咨询的图片进行裁剪):前期实现使用用vue-cropper插件对图片进行插件,----后续需求需要裁剪gif动图(vue-cropper、微信自带的截图工具,以及fastStone截图工具,都只能截取静态图片,打开动图时只显示某一帧的静态图片),所以需要研究为什么vue-cropper明明打开的是gif图,而结果显示的确实某一帧???对于上传图片的操作使用type=file的html标签,选中某个文件后产生文件流,然后我们将文件流转化为base64,通过img的src引入时,动图可以显示,但是通过vue-cropper这个插件中的组件src属性引入时,页面只能显示某一帧图片,所以vue-cropper插件不支持裁剪动图,

实现思路:仿照vue-cropper(没有现成的裁剪gif组件)

实现思路:三步很简单,但实现起来不容易(涉及到三个js库)

(1)上传gif动图,通过img标签显示在页面上

(2)在图片上显示裁剪框

(3)解析gif动图的某一帧,然后将每一帧生成canvas图像(每一帧都是一个图片,生成的图像已经是被裁剪过了的);

(4)将canvas图像转化为gif,通过addFrame收集canvas图像,收集完毕后调用render合成;

三个js库的作用—涉及到三个构造函数Cropper、GifToCanvas、Gif

(1)cropperjs显示裁剪框的组件,有一个Cropper 构造函数

(2)libgif-js库:通过实现对gif路径(通过第一步生成)发起一个请求,然后通过解析请求回来的gif数据来生成GIF实例(包括每一帧的动画,以及大小之类的基础数据),然后通过GIF实例生成对应的canvas,有一个GifToCanvas

(3)gif.js库:通过收集libgif库转换到canvas上面的每一帧的变化,来生成最终的GIF

具体实现:

(1)点击type=file的input标签选择文件,选中文件后拿到的是文件流,将文件流转化为base64,通过img标签显示到页面上;

(2)需要使用cropperjs库生成页面上的裁剪框,new Cropper构造函数(两个入参:当前image标签和裁剪框的大小等配置),构造函数的实例中包含了一些属性和方法(或者当前图片的url拿到的是base64,getCropData或者裁剪框的数据)

(3)需要将gif转化为canvas,libgif-js库,这个库中有一个GifToCanvas的构造函数,需要两个参数(第一个是gif图片的url—是可供浏览器使用的url,所以需将第一步拿到的base64—>blob—>window.URL.createObjectURL),第二个参数裁剪的尺寸区域;—

核心有一个onProgress这个方法;在这个方法中我们可以收集到动图的每一帧转化的canvas图像,所以我们需要在这个方法中将处理好的每一帧对应的canvas图像进行收集,是通过gifjs库中的一个addFrame方法来收集的;

在这里插入图片描述

(4)将canvas生成gif动图—通过Gifjs库来实现,有一个Gif 构造函数,构造函数中创建出来的实例对象上有一个方法addFrame,在gif转化为canvas过程中即onProgress方法中,调用addFrame进行canvas收集(对每一帧图片进行裁剪生成canvas),收集完所有的canvas图像后,调用.render方法进行gif动图合成;

参考

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/368394.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Blender 与 3ds Max | 面对面的直接较量(2024)

Blender和3ds Max,哪个动画软件更好?作为一个从事动画领域十年的专业人士,Mark McPherson提供了八条最新建议,帮助你了解哪个软件更适合满足你的3D动画需求。 1.建模 获胜者:3ds Max。3ds Max的建模机制已经被证明是…

uniapp H5 px转换rpx

uniapp H5 px转换rpx 安装 px2rpx 重启 HBuilderX在要转换的文件 点击右键 点击 开启px2rpx(1px转成2rpx) 开启成功!使用 编辑页面后 按下键盘 Ctrl s 保存!转化成功!当然 你也需要对使用的插件 进行转换!否则可能导致样式出现…

xinput1_3.dll文件缺失的解决方法

在使用计算机的过程中,遇到“找不到xinput1_3.dll”这样的错误提示并不罕见。该问题通常出现在尝试启动某些游戏或应用程序时,特别是那些依赖于Microsoft DirectX接口来处理输入设备(如游戏手柄)的程序。xinput1_3.dll是DirectX库…

Fink CDC数据同步(二)MySQL数据同步

1 开启binlog日志 2 数据准备 use bigdata; drop table if exists user;CREATE TABLE user(id INTEGER NOT NULL AUTO_INCREMENT,name VARCHAR(20) NOT NULL DEFAULT ,birth VARCHAR(20) NOT NULL DEFAULT ,gender VARCHAR(10) NOT NULL DEFAULT ,PRIMARY KEY(id) ); ALTER TA…

数学建模-退火算法和遗传算法

退火算法和遗传算法 一.退火算法 退火算法Matlab程序如下: [W]xlsread(D:100个目标经度纬度);>> x[W(:,1)];>> y[W(:,2)];>> w[x y];;d1[70, 40];>> w[d1;w;d1]ww*pi/180;%角度化成弧度dzeros(102);%距离矩阵初始化for i1:101…

STL——空间配置器

空间配置器是STL六大组件之一,它和其他五个组件相互配合,起着很关键的作用。 容器:各种数据结构、如vector、list、stack、deque、queue、set、map、unordered_map等等算法:各种算法,如sort、serach、copy、erase 提供…

【vue】报错 Duplicate keys detected 解决方案

错误描述:Duplicate keys detected. This may cause an update error.错误直译:检测到重复的键。这可能会导致错误。错误原因:有相同父元素的多个子元素的v-for有相同的key值。 解决方法: return:{dataList:[{name:张三&#xf…

坚持刷题|二叉树的前、中、后序遍历(递归迭代)

文章目录 题目思考递归实现迭代实现前序遍历后序遍历中序遍历 在前、中、后序的迭代遍历中,为什么都采用栈来模拟递归,而非队列? Hello,大家好,我是阿月。坚持刷题,老年痴呆追不上我,今天刷&…

excel给数据库初始化/旧数据处理(自动sql拼装)

思路: 首先导出数据到excel编写单条数据操作的sql利用excel CONCATENATE 函数自动生成,每一行数据的操作sql 小技巧:对于需要套娃的字段值,可以加一个临时列同样使用CONCATENATE函数进行sql拼装 案例: 1.临时列:CONCATENATE(C2, …

ROS方向第二次汇报(5)

文章目录 1.本方向内学习内容:1.1.自定义msg:1.1.1.定义msg文件:1.1.2.编辑配置文件: 1.2.自定义srv:1.2.1.定义srv文件:1.2.2.编辑配置文件: 1.3.服务通信案例实现:1.3.1.服务端实现…

回溯法:回溯法通用模版汇总以及模版应用

从一个问题开始 给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合。 示例: 输入: n 4, k 2 输出: [ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4] ] 很容易想到 用两个for循环就可以解决。 如果n为100,k为50呢,那就50层for循…

修改Vim编辑器的缩进和显示行数

一、Vim编辑器的缩进和显示行数 1.指令 sudo vi /etc/vim/vimrc2.插入内容 set tabstop4 set shiftwidth4 set nu 注意输入的格式,前后不要留空格 tabstop是输入按下tab缩进4个 shiftwidth是批量缩进4个 nu是显示行数

【blender烘焙】法线烘焙出现大面积结构丢失怎么办?blender烘焙vs八猴烘焙

用dcc烘焙法线是很常用的减面优化手段,很多建模的dcc自己也内置的烘焙的功能,像我自己在工作流中也偶尔用blender的烘焙做一下材质的整合优化,在质量要求不高的时候还算凑合可用。 问题描述 在前期的文章中飞燕2号建模,我就遇到…

Vue3+vite搭建基础架构(5)--- 使用vue-i18n

Vue3vite搭建基础架构(5)--- 使用vue-i18n 说明官方文档安装vue-i18n使用vue-i18n测试vue-i18n的国际化配置 说明 这里记录下自己在Vue3vite的项目使用vue-i18n做国际化语言的过程,不使用ts语法,方便以后直接使用。这里承接自己的…

Paper - 转角密度估计器 RDE (Rotamer Density Estimator) 算法

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/136002649 Paper: Rotamer density estimator is an unsupervised learner of the effect of mutations on protein-protein interaction 转角密…

公交最短距离-算法

题目 给定一个一维数组,其中每一个元素表示相邻公交站之间的距离,比如有四个公交站A,B,C,D,对应的距离数组为,1,2,3,4,如下图示 给定目标站X和Y,求他们之间最短的距离 解题 遍历一次整个数组,…

Docker搭建MySQL8主从复制

之前文章我们了解了面试官:说一说Binlog是怎么实现的,这里我们用Docker搭建主从复制环境。 docker安装主从MySQL 这里我们使用MySQL8.0.32版本: 主库配置 master.cnf //基础配置 [client] port3306 socket/var/run/mysqld/mysql.sock [m…

三分钟学懂C语言关键字——const

1,const修饰普通变量 const类型变量名常量; //类型:int char short 等等 类型const变量名常量; //举例:const int a5; int const a5;这两种写法表示a的值不能够改变 当我们直接改变const修饰的普通变量时,编译器会报…

Map和Set的封装

目录 一、底层原理 二、红黑树的节点 三、仿函数 四、迭代器 4.1、迭代器的定义: 4.2、*:解引用操作 4.3、->:成员访问操作符 4.4、!、 4.5、迭代器的: 4.6、迭代器的-- 五、Map 六、Set 七、红黑树源码 一、底层原理 我们要知道&#…

Docker 安装篇(CentOS)

Docker社区版 Docker从1.13版本之后采用时间线的方式作为版本号,分为社区版CE和企业版EE。 社区版是免费提供给个人开发者和小型团体使用的,企业版会提供额外的收费服务,比如经过官方测试认证过的基础设施、容器、插件等。 1、Docker 要求 C…