有点意思的gif动图生成平台开发实战(二)

精彩回顾

  • 如何实现H5可视化编辑器的实时预览和真机扫码预览功能

  • 在线IDE开发入门之从零实现一个在线代码编辑器

  • 基于React+Koa实现一个h5页面可视化编辑器-Dooring

  • TS核心知识点总结及项目实战案例分析

前言

笔者之前利于业余时间开发了一个gif动图生成平台, 具体开发背景我也在上一篇文章手把手教你撸一个能生成抖音风格动图的gif制作平台中介绍过了, 我们今天继续来实现该平台, gif动图平台的实现方式比较将完全用前端的手段来实现, 所以大家在接下来的内容中会发现很多有意思的前端插件. 接下来我们看看主要要实现的功能点:

  • 纯前端实现图片上传和预览

  • 基于react-beautiful-dnd实现元素自由拖动排序

  • 使用javascript实现生成uuid的函数

  • 使用file-saver实现前端下载文件

  • 使用gif.js实现基于图片生成gif动图

  • 控制gif动图播放速度的方法

正文

还是按照笔者一贯的风格, 在实现功能之前我们先看看实现后的预览效果: 

 由效果图可以看出我们只需要上传图片序列, 就可以动态生成gif动图, 并且可以右键保存gif文件. 我们还可以控制动图的播放速度和排列顺序, 以便更灵活的配置动图. 如果大家想亲自体验,可以用以下方式直达:

在线地址: http://io.nainor.com/qt

1. 基本页面搭建

在开始之前我们先要理清基本的页面结构, 笔者划分为如下结构:  由上图可知一共划分为3个区, 我们可以使用任何我们熟悉的第三方组件去实现, 笔者这里采用antd来开发. 技术方案图如下:  以上就是笔者分析的大致实现目标, 也是笔者常用的开发导图, 目标导向对开发效率的提升还是非常有帮助的, 笔者建议大家也可以在实现较复杂的业务需求之前先思考方案,再动手敲代码.

2. 实现图片上传预览功能

对于第一步骤的界面我想大家都能实现, 我们现在具体一步步落实到功能实现. 我们先来实现一下图片的上传预览. 由于我们这里没有借助服务器, 完全由前端的方式实现图片预览, 所以我们需要用到FileReader对象.

FileReader 对象允许Web应用程序异步读取存储在用户计算机上的文件(或原始数据缓冲区)的内容,使用 File 或 Blob 对象指定要读取的文件或数据。

其中File对象可以是来自用户在一个input元素上选择文件后返回的FileList对象,也可以来自拖放操作生成的DataTransfer对象,还可以是来自在一个HTMLCanvasElement上执行mozGetAsFile()方法后返回结果。接下来我们看看如何利用antd的Upload组件和FileReader实现图片预览, 具体代码如下:

const uploadprops = useMemo(() => ({name: 'file',multiple: true,listType:"picture-card",onPreview: () => {},showUploadList: false,beforeUpload(file, fileList) {// 解析并提取excel数据let reader = new FileReader();reader.onload = function(e) {let url = e.target.result;setImageList(prev => [...prev, {id: uuid(6, 16), url}])};reader.readAsDataURL(file);}}), []);

uploadprops即为Upload组件需要的属性配置, 通过代码我们可以知道, 我们在beforeUpload阶段拦截了图片, 通过FileReader对象的readAsDataURL API将读取到的文件转化为base64的地址, 这样我们就能通过如下方式展示图片了:

<img src={item.url} id={item.id} alt=""/>

在代码中我们将图片数据存储到一个对象里, 对象包括由uuid函数生成的唯一id和url组成, 至于为何生成唯一id, 这里笔者将在下文中介绍.

3. 使用react-beautiful-dnd实现元素自由拖动排序

大家在研究过H5-Dooring | 一款强大的开源H5编辑器 后就会发现react-dnd这个模块很熟悉, 因为该开源编辑器就使用了react-dnd实现的组件拖拽和组件数据传递的. 笔者在社区又发现了一个比较有意思的拖拽库react-beautiful-dnd, 同样可以实现优雅平滑的智能拖拽效果, 基本案例如下:  在深入研究该库之后笔者发现可以直接用来实现图片组件的拖拽并排序的功能, 所以笔者直接使用该库来封装我们的图片组件. 由于该库的使用有详细的案例代码,这里笔者就不做详细介绍了, 只需要提一点就是为了实现排序, 我们需求确定每一个元素的唯一标识, 所以这里笔者想到了uuid, 所以渲染图片的数组数据结构可以长这样:

const imgList = [{id: uuid(6, 10),url: '图片的base64位地址'}
]

为了限制图片上传过大, 我们还可以在Upload组件的beforeUpload阶段限制图片上传大小, 这个根据使用而定. uuid的实现方式很多, 笔者这里送上一个实现方式:

// 生成uuid
function uuid(len: number, radix: number) {let chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split('');let uuid = [],i;radix = radix || chars.length;if (len) {for (i = 0; i < len; i++) uuid[i] = chars[0 | (Math.random() * radix)];} else {let r;uuid[8] = uuid[13] = uuid[18] = uuid[23] = '-';uuid[14] = '4';for (i = 0; i < 36; i++) {if (!uuid[i]) {r = 0 | (Math.random() * 16);uuid[i] = chars[i === 19 ? (r & 0x3) | 0x8 : r];}}}return uuid.join('');
}

实现后的效果如下图:  至于删除图片的方法也很简单, 通过图片的唯一id去数组里使用数组的fiter方法删除即可.

4. 控制gif动图播放速度的方法

控制gif的播放速度方法我们可以用slider组件实现, gif.js也提供速度的接口, 我们只需要实现速度值的计算即可. 我们都知道滑块滑动越长, 数值越大, 与之对应的 速度越大, 时间间隔越小, 所以我们在前端层设计的展示效果如下:  滑块最大值笔者设置为20, 最小值为1, 对应的当滑块设置为最大值时, gif的播放速度最大, 每张图片停留间隔为0.1s, 滑块为最小值1时, gif播放速度最小, 每张图片停留2s, 根据这个规律我们得到了如下规律: 

具体代码如下:

const handleSpeed = (v) => {let realSpeed = (20 - v + 1) / 10;setSpeed(realSpeed)
}

当然大家可以用更简单的方式来实现, slider组件也提供反向取值的操作.

5. 基于图片序列生成gif动图

基于图片序列生成gif的方式也很简单, 我们通过批量获取图片拖动区的图片, 组装成数组传给gif.js即可. 我们直接看效果: 

6. 使用file-saver实现前端下载文件

我们只需要把生成的gif图片, 传递给file-saver模块中, 使用其提供的API即可下载文件, 这里在之前文章笔者也介绍过了, 这里直接上代码:

import { saveAs } from 'file-saver';// resultImage为gif生成的gif图片对象
saveAs(resultImage, `${uuid(6, 10)}.gif`);

最后

如果想学习更多H5游戏, webpack,node,gulp,css3,javascript,nodeJS,canvas数据可视化等前端知识和实战,欢迎在《趣谈前端》一起学习讨论,共同探索前端的边界。

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

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

相关文章

【达摩院OpenVI】AIGC技术在图像超分上的创新应用

团队模型、论文、博文、直播合集&#xff0c;点击此处浏览 一、背景 近10年来&#xff0c;深度学习技术得到了长足进步&#xff0c;在图像增强领域取得了显著的成果&#xff0c;尤其是以GAN为代表的生成式模型在图像复原、老片修复&#xff0c;图像超分辨率等方面大放异彩。图像…

怎么把静态地图做成gif动图?一键教你快速合成gif地图

想要做一个带有箭头标识的动态地图时&#xff0c;应该使用什么制作工具呢&#xff1f;很简单给大家推荐一款gif制作&#xff08;https://www.gif.cn/&#xff09;工具-【GIF中文网】只需要上传jpg、png格式的一张带箭头&#xff0c;一张不带箭头的图片&#xff0c;一键就能快速…

掘金设置gif动图头像

打开修改个人信息页面 , f12 , 打开console, 输入下面的代码 ,回车 , 刷新看一下吧 var ajax new XMLHttpRequest(); //https://juejin.im/user/update/user_info/ //旧版掘金的域名地址 //https://juejin.cn/user/update/user_info/ //2022-06-23更新时废弃 aj…

达摩院开源多模态对话大模型mPLUG-Owl

miniGPT-4的热度至今未减&#xff0c;距离LLaVA的推出也不到半个月&#xff0c;而新的看图聊天模型已经问世了。今天要介绍的模型是一款类似于miniGPT-4和LLaVA的多模态对话生成模型&#xff0c;它的名字叫mPLUG-Owl。 论文链接&#xff1a;https://arxiv.org/abs/2304.14178…

chatgpt真的太牛了!

真的太多人在研究了解chatgpt了 chatgpt仅仅是发展到3.5版本&#xff0c;就已经火的一塌糊涂&#xff0c;两个月活跃用户破亿&#xff0c;创历史记录。 原因是什么&#xff1f; 当然是GPT不仅仅是一个答案平台&#xff0c;还是一个拥有超智慧的得力助手&#xff01;再形象一…

ChatGPT超智慧AI真的那么牛吗?

ChatGPT是一种基于人工智能技术的聊天机器人&#xff0c;它可以模拟人类的对话方式&#xff0c;与用户进行交互。ChatGPT的出现为企业和个人带来了很多机遇&#xff0c;以下是一些抓住ChatGPT带来的机遇的建议&#xff1a; 1. 提高客户服务质量&#xff1a;ChatGPT可以为企业提…

职场人必备:工作述职报告PPT模板

作为一个职场人&#xff0c;不管你是高管还是普通员工&#xff0c;都少不了要做年度或者季度总结&#xff0c;亦或是述职报告、会议报告等类型的总结报告。鉴于很多人都有内容&#xff0c;但是无法形成框架&#xff0c;并且做出来的PPT也非常丑的问题&#xff0c;我们给大家提供…

构建聊天客户界面,包括消息显示文本框、消息发送文本框、选择好友的选择框、发送按钮。并为发送按钮添加事件,把消息显示在消息窗口中。

题目&#xff1a;构建聊天客户界面&#xff0c;包括消息显示文本框、消息发送文本框、选择好友的选择框、发送按钮。并为发送按钮添加事件&#xff0c;把消息显示在消息窗口中。 1.创建窗体与按钮、添加实训需要的组件 JTextField text ;//文本框JButton button ;//按钮JTextA…

【元宇宙欧米说】从个人创作者的角度聊聊NFT

普通人如何进入元宇宙&#xff1f;什么是在Web领域常见的坑&#xff1f;NFT创作方式的未来发展方向在哪&#xff1f; 9月2日下午三点&#xff0c;cat civilization创作者cat小浪将以“从个人创作者的角度聊聊NFT”为题&#xff0c;分享自己进入元宇宙、web3领域的经验&#xf…

常用的画图工具(UML图、业务流程图、时序图)

画图工具 http://draw.io http://draw.io是一个免费的画图工具&#xff0c;为用户提供最强大、易用的作图功能&#xff0c;既支持在线画图&#xff0c;也支持离线画图&#xff01; 支持创作系统架构图、流程图、UML图、时序图、思维导图、组织结构图、网络拓扑图、BPMN、UI界…

程序流程图

程序流程图 简介基本结构作用及优缺点常用的标准符号 简介 程序流程图是用规定的符号描述一个专用程序中所需要的各项操作或判断的图示。这种流程图着重说明程序的逻辑性与处理顺序&#xff0c;具体描述了微机解题的逻辑及步骤。当程序中有较多循环语句和转移语句时&#xff0…

数据流程图画法

数据流图的绘制分三步走&#xff1a; 1、确定系统的输入输出&#xff1b; 2、由外向里画系统的顶层数据流图&#xff1b; 3、自顶向下逐层分解&#xff0c;绘出分层数据流图。 销售管理系统的分层数据流图 接下来&#xff0c;我们作进一步解读&#xff1a; 一、理解数据流…

如何绘制业务流程图?

绘制业务流程图是产品经理必备掌握的技能之一&#xff0c;尤其是对 B 端产品经理来说&#xff0c;要分析好需求写好一篇完整的 PRD 文档&#xff0c;首先就是绘制正确的业务流程图。 什么是业务流程图 在开始讲业务流程图之前&#xff0c;我们需要先了解一下业务流程图的定义。…

流程图怎么画?超详细教程,各种高逼格流程图轻松搞定!

无论是在办公还是在生活中&#xff0c;流程图都是一个必不可少的重要辅助工具&#xff0c;大到建筑设计小到生活计划都需要使用流程图来帮助我们更好的完成每一件事情&#xff01; 但是流程图怎么做呢&#xff1f;很多朋友还是不知道的&#xff0c;今天小编给大家带来快速绘制…

程序流程图N-S图PAD图

在需求分阶段经常使用3种方法去剖析我们所面对的业务。 程序流程图 任何复杂的程序图都应由5种基本控制结构组成或嵌套而成。 盒图&#xff08;N-S图&#xff09; Nassi和Scheiderman提出了一种符合结构化程序设计原则的图形描述工具&#xff0c;叫作盒图&#xff0c;也叫做…

AI作画的背后是怎么一步步实现的?一文详解AI作画算法原理+性能评测

前言 “AI作画依赖于多模态预训练&#xff0c;实际上各类作画AI模型早已存在&#xff0c;之所以近期作品质量提升很多&#xff0c;可能是因为以前预训练没有受到重视&#xff0c;还达不到媲美人类的程度&#xff0c;但随着数据量、训练量的增多&#xff0c;最终达到了现在呈现…

漫画人工智能下象棋,走一步,能看几步?

老师爱下象棋&#xff0c;就是谁也赢不了。 去公园下了一盘棋 &#xff0c;第一步我就走了一个当头炮 &#xff0c;剩下的都是大爷们帮我走的。 结果&#xff0c;我输了。 经过他们的总结研究&#xff0c;我第一步走错了 。 2022年&#xff0c;象棋AI下棋机器人&#xff0c;…

Python实现照片卡通化,一拳打破次元壁 | 机器学习

目录 前言 项目结构 核心代码 总结 前言 接着我上一篇开源机器学习的使用&#xff1a;如何将照片变成卡通图&#xff0c;animegan2-pytorch机器学习项目使用 | 机器学习_阿良的博客-CSDN博客 我还是继续把项目稍微魔改一下&#xff0c;依然变为一个python文件就可以执行单…

人工智能画画 yyds

最近 AI 绘画火的一塌糊涂&#xff0c;你输一句话 AI 自动把你描述的场景画出来。本文盘点 GitHub 上几个较火的 AI 绘画开源项目。 本期推荐开源项目目录&#xff1a; 1. Latent Diffusion 2. PI-REC 3. Disco Diffusion 4. DALLE 01 Latent Diffusion Stable Diffusion 是 St…

人脸动漫化AnimeGAN V2的具体实施步骤

本文提供应对课设&#xff0c;毕设的小伙伴们一些参考&#xff1a;项目是参照网络上比较火的一个项目AnimeGAN V2&#xff0c;然后当时的一个课题也是跟这个相关&#xff0c;然后我是直接调用这个的&#xff0c;但是中间遇到过很多的问题&#xff0c;现在想说明一些问题&#x…