將 GSAP 動畫轉換為動畫 GIF:使用 modern-gif 的分步指南
關鍵要點
- 可以使用一個過程將 GSAP 動畫轉換為動畫 GIF,該過程涉及在每次調整補間時捕獲 SVG 數據並將其寫入 HTML 畫布。然後,可以將此 SVG 數據轉換為光柵化圖像數據,然後由 modern-gif 用於創建動畫 GIF 的每一幀。
- 轉換過程涉及多個步驟,包括捕獲 SVG 數據、將 SVG 數據轉換為光柵化數據,最後將光柵化數據轉換為 GIF。每個步驟都涉及特定的代碼修改和使用數組來存儲捕獲和轉換的數據。
- 由於瀏覽器動畫和 GIF 之間的幀速率通常不同,因此最終 GIF 的幀速率可能比原始動畫慢。為了加快 GIF 的速度,可以使用數組過濾器和 JavaScript 餘數運算符來確定索引是否可以被某個數字整除,從而丟棄一些幀。
本文將解釋如何使用 modern-gif 將使用 GSAP 創建的動畫轉換為動畫 GIF。
以下是一個我之前製作的動畫預覽:
在下面的鏈接中,您可以找到本文中將要參考的所有代碼的實時預覽:
- ? 預覽:
- 索引:gsap-animation-to-gif.netlify.app
- 簡易版:gsap-animation-to-gif.netlify.app/simple
- ⚙️ 代碼庫:github.com/PaulieScanlon/gsap-animation-to-gif
代碼庫中有兩個“頁面”。 index 包含上面 GIF 的所有代碼,simple 是本文中介紹的步驟的起點。
如何將 GSAP 動畫轉換為 GIF
我用來將 GSAP 動畫轉換為 GIF 的方法涉及在補間的每次“更新”時捕獲 SVG 數據並將其寫入 HTML 畫布。補間完成後,我就可以將 SVG 數據轉換為光柵化圖像數據,modern-gif 可以使用它來創建動畫 GIF 的每一幀。
入門
這是我在簡單示例中使用的代碼,我將用它來解釋從 GSAP 動畫創建動畫 GIF 所需的每個步驟:
<!DOCTYPE html> <html lang='en'> <head> <meta charset='utf-8' /> <title>Simple</title> </head> <body> <main> <svg id='svg' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 400 200' width={400} height={200} style={{ border: '1px solid red' }} > <rect id='rect' x='0' y='75' width='50' height='50' fill='red'></rect> </svg> <canvas id='canvas' style={{ border: '1px solid blue' }} width={400} height={200}></canvas> <img src="/static/imghwm/default1.png" data-src="https://img.php.cn/upload/article/000/000/000/173898187373194.jpg?x-oss-process=image/resize,p_40" class="lazy" alt="How to Create Animated GIFs from GSAP Animations " /></p> <h2 id="将-SVG-数据转换为光栅化数据">将 SVG 数据转换为光栅化数据</h2> <pre class="brush:php;toolbar:false"><code class="language-javascript">gsap.timeline({ onUpdate: () => { const xml = new XMLSerializer().serializeToString(svg); const src = `data:image/svg+xml;base64,${btoa(xml)}`; animationFrames.push(src); }, onComplete: () => { let inc = 0; const renderSvgDataToCanvas = () => { const virtualImage = new Image(); virtualImage.src = animationFrames[inc]; virtualImage.onload = () => { ctx.clearRect(0, 0, 400, 200); ctx.drawImage(virtualImage, 0, 0, 400, 200); canvasFrames.push(canvas.toDataURL('image/jpeg')); inc++; if (inc < animationFrames.length) { renderSvgDataToCanvas(); } else { //console.log(canvasFrames); //调试用 generateGif(); } }; }; renderSvgDataToCanvas(); }, }) .fromTo('#rect', { x: -50 }, { duration: 2, x: 350, ease: 'power.ease2' });
此步驟稍微複雜一些,需要對 animationFrames 數組的每個索引執行一個操作。
通過使用遞歸函數 renderSvgDataToCanvas,我可以使用 animationFrames 數組中的圖像數據,將其寫入畫布。然後,通過使用 canvas.toDataURL('image/jpeg'),我可以將動畫每一幀的光柵化數據存儲在 canvasFrames 數組中。
如果已在 onComplete 函數中添加 console.log,則應在瀏覽器控制台中看到類似於以下內容。但是,這次請注意數據的 MIME 類型:它不是 svg xml,而是 image/jpeg。這對於我接下來要做的工作很重要。
將光柵化數據轉換為 GIF
這是最後一步,它涉及將 canvasFrames 數組的每個索引傳遞到 modern-gif。
<!DOCTYPE html> <html lang='en'> <head> <meta charset='utf-8' /> <title>Simple</title> </head> <body> <main> <svg id='svg' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 400 200' width={400} height={200} style={{ border: '1px solid red' }} > <rect id='rect' x='0' y='75' width='50' height='50' fill='red'></rect> </svg> <canvas id='canvas' style={{ border: '1px solid blue' }} width={400} height={200}></canvas> <img src="/static/imghwm/default1.png" data-src="https://img.php.cn/upload/article/000/000/000/173898187373194.jpg?x-oss-process=image/resize,p_40" class="lazy" alt="How to Create Animated GIFs from GSAP Animations " /></p> <h2 id="将-SVG-数据转换为光栅化数据">将 SVG 数据转换为光栅化数据</h2> <pre class="brush:php;toolbar:false"><code class="language-javascript">gsap.timeline({ onUpdate: () => { const xml = new XMLSerializer().serializeToString(svg); const src = `data:image/svg+xml;base64,${btoa(xml)}`; animationFrames.push(src); }, onComplete: () => { let inc = 0; const renderSvgDataToCanvas = () => { const virtualImage = new Image(); virtualImage.src = animationFrames[inc]; virtualImage.onload = () => { ctx.clearRect(0, 0, 400, 200); ctx.drawImage(virtualImage, 0, 0, 400, 200); canvasFrames.push(canvas.toDataURL('image/jpeg')); inc++; if (inc < animationFrames.length) { renderSvgDataToCanvas(); } else { //console.log(canvasFrames); //调试用 generateGif(); } }; }; renderSvgDataToCanvas(); }, }) .fromTo('#rect', { x: -50 }, { duration: 2, x: 350, ease: 'power.ease2' });
使用 modernGif.encode,您可以將數據數組傳遞到 frames 並為每一幀定義延遲,我選擇添加 0 秒的延遲。
代碼的下一部分處理轉換 modernGif.ecode 數據並將其轉換為“另一個”MIME 類型,這次是 image/gif。
一旦我有了表示動畫 GIF 的最終“blob”數據,我就將其轉換為 URL,然後設置 image 和 link 元素的 src 和 href,以便我可以在瀏覽器中查看和下載 GIF。
幀速率
您可能會注意到最終的GIF 運行速度相當慢,這是因為在瀏覽器中運行的動畫通常每秒播放60 幀(fps),而GIF 的幀速率通常要慢得多,為12 或24 fps。
為了“丟棄”一些動畫幀,我使用數組過濾器和 JavaScript 餘數運算符來確定索引是否可以被某個數字整除,在我的例子中,我選擇 6。不能被 6 整除的索引將從數組中過濾掉。生成的動畫 GIF 雖然有點笨拙,但播放速度會快得多。
我已經在 generateGif
函數中添加了 filter
方法來實現幀速率的調整。
就是這樣,您可以通過 HTML 畫布將 GSAP SVG 動畫轉換為動畫 GIF!
如果您對本文中描述的任何內容有任何疑問,請隨時在 Twitter/X 上找到我:@PaulieScanlon。
以上是如何從GSAP動畫創建動畫GIF的詳細內容。更多資訊請關注PHP中文網其他相關文章!

Python和JavaScript的主要區別在於類型系統和應用場景。 1.Python使用動態類型,適合科學計算和數據分析。 2.JavaScript採用弱類型,廣泛用於前端和全棧開發。兩者在異步編程和性能優化上各有優勢,選擇時應根據項目需求決定。

選擇Python還是JavaScript取決於項目類型:1)數據科學和自動化任務選擇Python;2)前端和全棧開發選擇JavaScript。 Python因其在數據處理和自動化方面的強大庫而備受青睞,而JavaScript則因其在網頁交互和全棧開發中的優勢而不可或缺。

Python和JavaScript各有優勢,選擇取決於項目需求和個人偏好。 1.Python易學,語法簡潔,適用於數據科學和後端開發,但執行速度較慢。 2.JavaScript在前端開發中無處不在,異步編程能力強,Node.js使其適用於全棧開發,但語法可能複雜且易出錯。

javascriptisnotbuiltoncorc; sanInterpretedlanguagethatrunsonenginesoftenwritteninc.1)JavascriptwasdesignedAsignedAsalightWeight,drackendedlanguageforwebbrowsers.2)Enginesevolvedfromsimpleterterpretpretpretpretpreterterpretpretpretpretpretpretpretpretpretcompilerers,典型地,替代品。

JavaScript可用於前端和後端開發。前端通過DOM操作增強用戶體驗,後端通過Node.js處理服務器任務。 1.前端示例:改變網頁文本內容。 2.後端示例:創建Node.js服務器。

選擇Python還是JavaScript應基於職業發展、學習曲線和生態系統:1)職業發展:Python適合數據科學和後端開發,JavaScript適合前端和全棧開發。 2)學習曲線:Python語法簡潔,適合初學者;JavaScript語法靈活。 3)生態系統:Python有豐富的科學計算庫,JavaScript有強大的前端框架。

JavaScript框架的強大之處在於簡化開發、提升用戶體驗和應用性能。選擇框架時應考慮:1.項目規模和復雜度,2.團隊經驗,3.生態系統和社區支持。

引言我知道你可能會覺得奇怪,JavaScript、C 和瀏覽器之間到底有什麼關係?它們之間看似毫無關聯,但實際上,它們在現代網絡開發中扮演著非常重要的角色。今天我們就來深入探討一下這三者之間的緊密聯繫。通過這篇文章,你將了解到JavaScript如何在瀏覽器中運行,C 在瀏覽器引擎中的作用,以及它們如何共同推動網頁的渲染和交互。 JavaScript與瀏覽器的關係我們都知道,JavaScript是前端開發的核心語言,它直接在瀏覽器中運行,讓網頁變得生動有趣。你是否曾經想過,為什麼JavaScr


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

Atom編輯器mac版下載
最受歡迎的的開源編輯器

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。