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动图合成;

参考

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JAVASE进阶:函数式编程——lambda表达式替代匿名内部类

👨‍🎓作者简介:一位大四、研0学生,正在努力准备大四暑假的实习 🌌上期文章:JAVASE进阶:强推!源码分析——字符串拼接底层原理、StringBuilder底层原理 📚订阅专栏&#…

机器学习——集成学习

📕参考:ysu老师课件西瓜书 期末复习笔记 1.集成学习的基本概念 集成学习(ensemble learing)通过构建并结合多个学习器来完成学习任务。 有时也被称为多分类器系统(multi-classifier system)、基于委员会的…

Spring Cloud Stream解密:流式数据在微服务中的魔力

欢迎来到我的博客,代码的世界里,每一行都是一个故事 Spring Cloud Stream解密:流式数据在微服务中的魔力 前言Spring Cloud Stream基础:微服务中的数据流动Binder概念与使用:连接流的音符消息序列化与反序列化&#xf…

开源社区的力量:共同构建数字时代的未来(AI)

开源社区的力量:共同构建数字时代的未来 引言开源社区的定义与发展历程 1. 开源社区的定义2. 发展历程 开源社区的核心价值 1. 技术共享与创新2. 协作与社区建设3. 自由开放的精神 开源社区对数字时代的贡献 1. 技术创新的推动者2. 开放式标准的制定者3. 教育和培训…

【消息队列】kafka整理

kafka整理 整理kafka基本知识供回顾。

Leetcode刷题笔记题解(C++):99. 恢复二叉搜索树

思路: 二叉搜索树的中序遍历是递增序列,可以在中序遍历中记录两个需要交换的节点,直到遍历完毕之后,对两个节点的值进行交换即可得到正确的二叉搜索树 比如中序序列为 1 2 3 7 5 6 4(7比5大记录7为x&#xf…

每日OJ题_算法_模拟③_力扣6. Z 字形变换

目录 力扣6. Z 字形变换 解析代码 力扣6. Z 字形变换 6. Z 字形变换 难度 中等 将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。 比如输入字符串为 "PAYPALISHIRING" 行数为 3 时,排列如下&#xff…

以太网帧格式及ARP协议简介

在以太网中,一个主机和另一个主机进行通信,必须要知道目的主机的MAC地址(物理地址),只要知道目的主机的IP地址,就可以通过ARP协议获取目的主机的MAC地址。 1、ARP协议简介 ARP(Address Resolut…

处理安装uni-ui依赖一直安装不上

根据官方的文档去安装,我这边把npm换成了pnpm。 搞了一个小时没搞明白为什么下载不下来依赖,原因是镜像的问题。 处理方式:安装了cnpm,去访问国内镜像 安装cnpm,使用国内镜像 npm install -g cnpm --registryhttps…

react 之 useCallback

简单讲述下useCallback的使用方法,useCallback也是用来缓存的,只不过是用于做函数缓存 // useCallbackimport { memo, useCallback, useState } from "react"const Input memo(function Input ({ onChange }) {console.log(子组件重新渲染了…

Ubuntu上开启FTP服务教程

在Ubuntu服务器上配置FTP服务是一个常见的需求,无论是用于文件分享、网站管理还是数据备份。FTP(文件传输协议)是一种用于在网络上传输文件的协议,它可以让用户通过身份验证下载或上传文件。本文将指导您如何在Ubuntu系统上安装和…

【第二十二课】最短路:多源最短路floyd算法(acwing-852 spfa判断是否存在负环 / acwing-854 / c++代码)

目录 acwing-852 代码如下 一些解释 acwing-854 foyld算法思想 代码如下 一些解释 acwing-852 在spfa求最短路的算法基础上进行修改。 代码如下 #include<iostream> #include<cstring> #include<algorithm> #include<queue> using names…

百分点科技:《数据科学技术: 文本分析和知识图谱》

科技进步带来的便利已经渗透到工作生活的方方面面&#xff0c;ChatGPT的出现更是掀起了新一波的智能化浪潮&#xff0c;推动更多智能应用的涌现。这背后离不开一个朴素的逻辑&#xff0c;即对数据的收集、治理、建模、分析和应用&#xff0c;这便是数据科学所重点研究的对象——…

Python itertools模块:生成迭代器(实例分析)

itertools 模块中主要包含了一些用于生成迭代器的函数。在 Python 的交互式解释器中先导入 itertools 模块&#xff0c;然后输入 [e for e in dir(itertools) if not e.startswith(_)] 命令&#xff0c;即可看到该模块所包含的全部属性和函数&#xff1a; >>> [e for …

6-2 B. DS二叉树--叶子数量

题目描述 计算一颗二叉树包含的叶子结点数量。 提示&#xff1a;叶子是指它的左右孩子为空。 建树方法采用“先序遍历空树用0表示”的方法&#xff0c;即给定一颗二叉树的先序遍历的结果为AB0C00D00&#xff0c;其中空节点用字符‘0’表示。 输入 第一行输入一个整数t&#xff…

【单片机毕业设计6-基于stm32c8t6的智能衣柜系统】

【单片机毕业设计6-基于stm32c8t6的智能衣柜系统】 前言一、功能介绍二、硬件部分三、软件部分总结 前言 &#x1f525;这里是小殷学长&#xff0c;单片机毕业设计篇6基于stm32的智能衣柜系统 &#x1f9ff;创作不易&#xff0c;拒绝白嫖可私 一、功能介绍 -------------------…

C++类与对象的简单应用【日期类的简单实现】

在咱们刚接触C,写一个日期类进行练习&#xff0c;实现从能比较多&#xff0c;如计算日期差&#xff0c;设置日期&#xff0c;输出日期… 下面我会展示一个简单的日期类 声明 #include <iostream> #include <assert.h> using namespace std;class Date { public:b…

Vue 上门取件时间组件

本文使用vue2.0elementui 制作一个上门取件时间组件&#xff0c;类似顺丰&#xff0c;样式如下&#xff1a; 大概功能&#xff1a;点击期望上门时间&#xff0c;下面出现一个弹框可以选择时间&#xff1a; 首先我们定义一些需要的数据&#xff1a; data() {return {isDropdown…

Java 集合List相关面试题

&#x1f4d5;作者简介&#xff1a; 过去日记&#xff0c;致力于Java、GoLang,Rust等多种编程语言&#xff0c;热爱技术&#xff0c;喜欢游戏的博主。 &#x1f4d7;本文收录于java面试题系列&#xff0c;大家有兴趣的可以看一看 &#x1f4d8;相关专栏Rust初阶教程、go语言基…

C++ 动态规划 分组背包问题

有 N 组物品和一个容量是 V 的背包。 每组物品有若干个&#xff0c;同一组内的物品最多只能选一个。 每件物品的体积是 vij &#xff0c;价值是 wij &#xff0c;其中 i 是组号&#xff0c;j 是组内编号。 求解将哪些物品装入背包&#xff0c;可使物品总体积不超过背包容量&a…