最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaScript前端實現(xiàn)GIF圖片循環(huán)播放

 更新時間:2025年03月11日 09:39:35   作者:MINO吖  
使用 img 加載 GIF 圖片,內(nèi)容只會播放一次,之后就會自動暫停,所以這篇文章為大家介紹了如何使用JavaScript實現(xiàn)GIF圖片循環(huán)播放吧

前言

使用 img 加載 GIF 圖片,內(nèi)容只會播放一次,之后就會自動暫停;

通過定時器在一段時間后重新加載圖片的方式,會導(dǎo)致瀏覽器內(nèi)存不斷增大,并且可能會有閃爍、卡頓的問題;

ImageDecoder

WebCodecs API 的 ImageDecoder 接口提供了一種對編碼圖像數(shù)據(jù)進行解包和解碼的方法。

ImageDecoder 只能在 localhost 或者 https 的 tab 頁中獲取到

代碼

1.canvas 設(shè)置 width 和 height,和 GIF 圖片尺寸一致

<canvas width="1310" height="954"></canvas>

或許你也可以通過一下方法動態(tài)設(shè)置尺寸;

const img = new Image();
img.src = '圖片路徑';
img.onload = function() {
    var width = this.width;   // 圖片寬度
    var height = this.height; // 圖片高度
    console.log(`圖片尺寸為:${width} x ${height}`);
    
    // some code... 
    // 為canvas 設(shè)置 width、height
};

2.通過 fetch 獲取 GIF 圖片資源,傳入 url

fetch(url).then((response) => decodeImage(response.body));

3.decodeImage 方法對圖片解碼

imageDecoder = new ImageDecoder({ data: imageByteStream, type: "image/gif" });
imageDecoder.decode({ frameIndex: imageIndex }).then(renderImage);

4.renderImage 渲染每一幀的圖片

 function renderImage (result) {
   const canvas = document.querySelector("canvas");
   const canvasContext = canvas.getContext("2d");
 
   // 繪制圖片 
   canvasContext.drawImage(result.image, 0, 0);
 
   const track = imageDecoder.tracks.selectedTrack;
 
   if (imageDecoder.complete) {
     if (track.frameCount === 1) return;
 
 	 // 如果序號超出了幀數(shù),重置為 0
     if (imageIndex + 1 >= track.frameCount) imageIndex = 0;
   }
 
   // 解碼下一幀圖片并渲染
   imageDecoder
     .decode({ frameIndex: ++imageIndex })
     .then((nextResult) =>
       setTimeout(() => {
         renderImage(nextResult);
       }, result.image.duration / 1000) // 可以調(diào)整播放速度
     )
     .catch((e) => {
       if (e instanceof RangeError) {
         imageIndex = 0;
         imageDecoder.decode({ frameIndex: imageIndex }).then(renderImage);
       } else {
         throw e;
       }
     });
 }

完整代碼

<template>
	<div>
		<canvas width="1310" height="954"></canvas>
	</div>
</template>

<script>
export default {
	mounted() {
		this.play(require("@/assets/images/animate.gif"));
	},
	play(url) {
		let imageDecoder = null;
      	let imageIndex = 0;

	      function renderImage (result) {
	        const canvas = document.querySelector("canvas");
	        const canvasContext = canvas.getContext("2d");
	
	        canvasContext.drawImage(result.image, 0, 0);
	
	        const track = imageDecoder.tracks.selectedTrack;
	
	        if (imageDecoder.complete) {
	          if (track.frameCount === 1) return;
	
	          if (imageIndex + 1 >= track.frameCount) imageIndex = 0;
	        }
	
	        imageDecoder
	          .decode({ frameIndex: ++imageIndex })
	          .then((nextResult) =>
	            setTimeout(() => {
	              renderImage(nextResult);
	            }, result.image.duration / 1000)
	          )
	          .catch((e) => {
	            if (e instanceof RangeError) {
	              imageIndex = 0;
	              imageDecoder.decode({ frameIndex: imageIndex }).then(renderImage);
	            } else {
	              throw e;
	            }
	          });
	      }
	
	      function decodeImage (imageByteStream) {
	        imageDecoder = new ImageDecoder({ data: imageByteStream, type: "image/gif" });
	        imageDecoder.decode({ frameIndex: imageIndex }).then(renderImage);
	      }
	
	      fetch(url).then((response) => decodeImage(response.body));
	}
}
</script>

到此這篇關(guān)于JavaScript前端實現(xiàn)GIF圖片循環(huán)播放的文章就介紹到這了,更多相關(guān)JavaScript GIF圖片循環(huán)播放內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 記一次webpack3升級webpack4的踩坑經(jīng)歷

    記一次webpack3升級webpack4的踩坑經(jīng)歷

    這篇文章主要介紹了記一次webpack3升級webpack4的踩坑經(jīng)歷,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-06-06
  • 解決layui-table單元格設(shè)置為百分比在ie8下不能自適應(yīng)的問題

    解決layui-table單元格設(shè)置為百分比在ie8下不能自適應(yīng)的問題

    今天小編就為大家分享一篇解決layui-table單元格設(shè)置為百分比在ie8下不能自適應(yīng)的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-09-09
  • 如何在面試中手寫出javascript節(jié)流和防抖函數(shù)

    如何在面試中手寫出javascript節(jié)流和防抖函數(shù)

    這篇文章主要介紹了如何在面試中手寫出javascript節(jié)流和防抖函數(shù),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-10-10
  • 詳解如何使用Flutter動畫魔法使UI元素活起來

    詳解如何使用Flutter動畫魔法使UI元素活起來

    這篇文章主要為大家介紹了如何使用Flutter動畫魔法使UI元素活起來方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-04-04
  • JavaScript實現(xiàn)數(shù)組對象去重的多種方法

    JavaScript實現(xiàn)數(shù)組對象去重的多種方法

    這篇文章主要介紹了JavaScript實現(xiàn)數(shù)組對象去重的多種方法,使用set對象或使用`reduce`方法,本文結(jié)合示例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2023-02-02
  • 微信小程序自定義組件

    微信小程序自定義組件

    這篇文章主要為大家詳細(xì)介紹了微信小程序自定義組件的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • JavaScript如何通過userAgent判斷幾個常用瀏覽器詳解

    JavaScript如何通過userAgent判斷幾個常用瀏覽器詳解

    userAgent 屬性是一個只讀的字符串,聲明了瀏覽器用于 HTTP 請求的用戶代理頭的值,這篇文章主要給大家介紹了關(guān)于JavaScript如何通過userAgent判斷幾個常用瀏覽器的相關(guān)資料,需要的朋友可以參考下
    2021-06-06
  • JS克隆,屬性,數(shù)組,對象,函數(shù)實例分析

    JS克隆,屬性,數(shù)組,對象,函數(shù)實例分析

    這篇文章主要介紹了JS克隆,屬性,數(shù)組,對象,函數(shù),結(jié)合實例形式分析了javascript中面向?qū)ο蟪绦蛟O(shè)計相關(guān)的對象、屬性、函數(shù)及數(shù)組等相關(guān)技巧,需要的朋友可以參考下
    2016-11-11
  • 基于JS實現(xiàn)發(fā)送驗證碼的計時器效果

    基于JS實現(xiàn)發(fā)送驗證碼的計時器效果

    這篇文章主要為大家詳細(xì)介紹了如何基于JS實現(xiàn)一個發(fā)送驗證碼的計時器效果,文中的示例代碼講解詳細(xì),感興趣的小伙伴快跟隨小編一起學(xué)習(xí)一下吧
    2023-11-11
  • JS監(jiān)聽組合按鍵思路及實現(xiàn)過程

    JS監(jiān)聽組合按鍵思路及實現(xiàn)過程

    這篇文章主要介紹了JS監(jiān)聽組合按鍵思路及實現(xiàn)過程,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-04-04

最新評論

保德县| 阿拉善右旗| 江门市| 稷山县| 邹城市| 依安县| 驻马店市| 定结县| 丹凤县| 盐山县| 鄯善县| 岐山县| 和政县| 黔东| 察隅县| 清涧县| 富民县| 奉新县| 大安市| 莱芜市| 榕江县| 苍溪县| 来宾市| 克东县| 盐亭县| 永和县| 汉沽区| 隆安县| 竹北市| 元江| 兴国县| 敦化市| 襄垣县| 赤水市| 扎兰屯市| 灵武市| 宁明县| 加查县| 大城县| 望都县| 五寨县|