成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

手把手教你擼一個能生成抖音風格動圖的gif制作平臺

開發 架構
又到了一周一次的周總結, 筆者基于之前的開源項目 blink , 開發了一款能在線配置故障藝術, 并一鍵生成gif動圖的平臺, 這里暫時取名為QT. 接下來筆者將復盤一下該可視化平臺的實現步驟以及功能點, 讓大家都能做自己的Gif動圖生成平臺.

[[413844]]

前言

又到了一周一次的周總結, 筆者基于之前的開源項目 blink , 開發了一款能在線配置故障藝術, 并一鍵生成gif動圖的平臺, 這里暫時取名為QT. 接下來筆者將復盤一下該可視化平臺的實現步驟以及功能點, 讓大家都能做自己的Gif動圖生成平臺.

在線訪問地址: 趣圖——一款輕量級生成抖音風格動效的在線工具

正文

在開始正文之前, 我們先來看看使用效果圖:

首先我們拆解一下功能:

  • 圖形編輯區 —— 用來編輯動圖樣式, 問文字等
  • 預覽區 —— 用來預覽用戶實時配置的動畫效果
  • 結果展示區 —— 用來存放生成的gif效果
  • gif文件自動下載

我們大致理清了我們需要實現的功能之后, 我們就可以一步步來實現了.

在這里我想先簡單介紹一下背景: 在筆者之前開源了生成自定義故障藝術的組件庫Blink之后, 發現如果要將故障動圖放到第三方平臺, 必須需要用第三方錄屏軟件先把動圖錄制下來, 然后保存gif之后在傳到第三方平臺, 這個操作鏈路如下: 

筆者是在忍受不了那么多步驟, 一般在筆者的認知里一般實現一件簡單的事情超過3個步驟, 筆者是不能接受的,尤其是錄屏這種耗時任務. 所以再三思考還是決定自己開發一個平臺,將步驟壓縮到2步:

好了, 開始我們下面的技術探索.

1.1 開發圖形編輯區

圖形編輯區主要是表單編輯, 筆者這里使用antd來快速搭建一個簡單表單, 唯一值得注意的就是顏色組件, 這里筆者使用react-color, 因為vue3.0對jsx支持越來越好, 所以實現原理和react很像,這里筆者就直接用react來舉例子. 代碼如下:

  1. <div className={styles.editorArea}> 
  2.   <div className={styles.formItem}> 
  3.     <span className={styles.label}>文字: </span> 
  4.     <Input value={value['text']} placeholder="請輸入文本內容" onChange={(e) => onChange('text', e)} /> 
  5.   </div> 
  6.   <div className={styles.formItem}> 
  7.     <span className={styles.label}>大小: </span> 
  8.     <InputNumber value={value['fontSize']} placeholder="請輸入文本大小" onChange={(e) => onChange('fontSize', e)} /> 
  9.   </div> 
  10.   <div className={styles.formItem}> 
  11.     <span className={styles.label}>文字顏色: </span> 
  12.     <Color value={value['textColor'][0]} onChange={(e) => onChange('textColor', e, 1)} /> 
  13.     <Color value={value['textColor'][1]} onChange={(e) => onChange('textColor', e, 2)} /> 
  14.   </div> 
  15.   <div className={styles.formItem}> 
  16.     <span className={styles.label}>背景色: </span> 
  17.     <Color value={value['themeColor']} onChange={(e) => onChange('themeColor', e)} /> 
  18.   </div> 
  19.   <div className={styles.formItem}> 
  20.     <span className={styles.label}></span> 
  21.     <Button type="primary" onClick={generateGif}>導出Gif</Button> 
  22.     {/* <Button style={{marginLeft: '20px'}} onClick={reset}>重置</Button> */} 
  23.   </div> 
  24. </div> 

 

 

 

 

大家可以不用太關注代碼細節, 你可以使用任何熟悉的方式去開發, 表單編輯器主要是實現和預覽區域的互通, 在react里我們用hooks組件的useState來和Blink組件互通, vue的話可以直接用data或者vuex解決問題, 具體如下圖實現:

只要大家能實現這種過程就可以了. 在QT項目里的效果如下: 

1.2 實現預覽區

預覽區域的實現很簡單, 通過Blink暴露的屬性來動態傳遞即可, 這里我們有必要了解一下Blink的內部實現, 先上一下githugb地址: 基于react的css故障藝術庫 , 我們直接看組件的實現方式:

  1. import React, { useRef, useEffect } from 'react' 
  2. import './index.less' 
  3.  
  4. export default function Blink(props) { 
  5.   const {  
  6.     text = '趣談前端'
  7.     fontSize = '48px'
  8.     themeColor = '#000'
  9.     textColor = ['#74fcfd''#ea3448'], 
  10.     onRef 
  11.   } = props 
  12.  
  13.   const ref = useRef(null
  14.  
  15.   useEffect(() => { 
  16.     onRef && onRef(ref) 
  17.   }, []) 
  18.  
  19.   return ( 
  20.     <div className='blink' style={{backgroundColor: themeColor}} ref={ref}> 
  21.       <div className="blink-item" data-text={text} style={{fontSize: fontSize}}> 
  22.         <div className="text text-front" style={{color: textColor[0]}}>{text}</div> 
  23.         <div className="text text-back" style={{color: textColor[1]}}>{text}</div> 
  24.       </div> 
  25.     </div>  
  26.   ) 

至于樣式問題, 筆者在github里有詳細的介紹, 這里就不詳細說明了. 所以說我們在項目中實現預覽也很簡單, 直接引入組件即可:

  1. <Blink {...value} onRef={(ref) => { blinkRef.current = ref.current}} /> 

value就是form表單的配置產物.

1.3 實現預覽gif動圖

實現預覽gif動圖是文章的重點, 我們要考慮如何將dom轉化為圖片, 然后再將圖片轉化為gif. 這塊筆者思考了一會, 想出了一個解決方案, 思路如下: 先用canvas庫定時截取預覽區域的動畫效果, 生成n張關鍵幀圖片, 然后利用canvas將多張關鍵幀組裝成gif動圖. 筆者的思路主要采用的flash軟件的關鍵幀動畫的實現, 具體流程如下:

圖中我們涉及到了幾個有意思的插件, 筆者在H5-Dooring項目中也用到過,分別為:

  • dom-to-image —— 轉門將dom轉化為圖片的庫
  • gif.js —— 將多張圖片轉化為gif動圖

實現過程中由于dom-to-image產生圖片的過程是異步的, 但是我們要將所以圖片生成完之后才能傳給gif.js, 這里筆者用了promise.all;來實現(注意, 考點). 我們先將第一步驟二次封裝成新的promise對象, 代碼如下:

  1. const generateImg = (node, imgId, time) => { 
  2.     return new Promise((resolve, reject) => { 
  3.       setTimeout(() => { 
  4.         domtoimage.toPng(node) 
  5.         .then(function (dataUrl) { 
  6.           let img = new Image(); 
  7.           img.src = dataUrl; 
  8.           img.id = imgId; 
  9.           img.className = 'imgPiece'
  10.           document.getElementById('imgBox').appendChild(img); 
  11.           resolve(document.getElementById(imgId)); 
  12.         }) 
  13.         .catch(function (error) { 
  14.           reject(error); 
  15.         }); 
  16.       }, time
  17.     }) 
  18.  } 

其次我們使用promise.all來將圖片統一收集傳給gif.js對象:

  1. const generateGif = () => { 
  2.     document.getElementById('imgBox').innerHTML = ''
  3.     let blink = blinkRef.current
  4.     let promiseArr = []; 
  5.  
  6.     for(let i=0, len=24; i < len; i++) { 
  7.       promiseArr.push(generateImg(blink, `img${i+1}`, 16 * i)); 
  8.     } 
  9.  
  10.     Promise.all(promiseArr).then(res => { 
  11.       if(res) { 
  12.         let w = res[0].width; 
  13.         let h = res[0].height; 
  14.          // res即為所有的img集合, 可以直接傳給gif.js ... 
  15.         }); 
  16.       } 
  17.     }) 
  18.   } 

關于gif.js的使用方法, 官網里也有詳細的介紹, 這里筆者不一一舉例了, 感興趣的朋友可以研究一下.

1.4 一鍵下載gif動圖

實現現在gif文件我們采用file-saver模塊來實現, 實現思路也很簡單, 如下:

  1. saveAs(image, `${uuid(6, 10)}.gif`); 

image即是gif.js或者其他動圖插件生成的gif圖片, uuid主要是給圖片命名. 我們可以看看幾個下載好的gif例子:

[[413849]]

最后

在H5編輯器H5-Dooring中,后期也會實現類似的功能,大家感興趣的可以了解一下。

github:H5編輯器H5-Dooring

github:Blink

本文轉載自微信公眾號「趣談前端」,可以通過以下二維碼關注。轉載本文請聯系趣談前端公眾號。

 

責任編輯:武曉燕 來源: 趣談前端
相關推薦

2022-08-26 08:01:38

DashWebJavaScrip

2022-02-14 09:11:17

視頻下載器抖音

2022-10-19 14:30:59

2023-03-22 09:00:38

2021-06-22 10:43:03

Webpack loader plugin

2022-09-22 12:38:46

antd form組件代碼

2019-08-26 09:25:23

RedisJavaLinux

2022-06-28 15:29:56

Python編程語言計時器

2020-12-14 08:05:28

Javascript隨機canvas

2021-07-14 09:00:00

JavaFX開發應用

2020-12-23 09:48:37

數據工具技術

2018-11-22 09:17:21

消息推送系統

2016-11-01 09:46:04

2021-08-31 10:02:10

KubernetesLinux集群

2011-01-10 14:41:26

2011-05-03 15:59:00

黑盒打印機

2025-05-07 00:31:30

2016-10-25 14:54:37

2023-11-28 07:36:41

Shell腳本部署

2021-11-10 11:40:42

數據加解密算法
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产一区 | 亚洲一级av毛片 | 国产综合网址 | 色一级片| 国产免费一区二区三区最新6 | 成人免费网站视频 | 99精品国产一区二区青青牛奶 | 黄免费在线 | 国产乱码精品一区二区三区中文 | 亚洲国产成人精品在线 | 99这里只有精品视频 | 欧美精三区欧美精三区 | 日韩久久久久久 | 久久91| 久久99国产精一区二区三区 | 欧美午夜精品久久久久免费视 | 福利国产| 欧美精品二区三区 | 日本高清视频在线播放 | 91国内产香蕉 | 日日久 | 久久av一区二区 | 久久久123 | 精品香蕉一区二区三区 | 精品欧美一区二区三区久久久小说 | 国产小视频在线观看 | 欧洲一区在线观看 | 欧美一区二区三区在线观看视频 | 欧美www在线观看 | 91久久精品一区二区三区 | 国产精品日韩欧美一区二区 | 蜜臀网站| 亚洲一区在线播放 | 久久久久久www | 精品在线| 日韩中文字幕在线观看 | 欧美午夜视频 | 国产精品久久久久久久久久久久 | 亚洲一区二区三区乱码aⅴ 四虎在线视频 | 亚洲一区二区三区视频在线 | 在线视频中文字幕 |