跟大家講解下我前幾天看到的一個有趣小demo:影片線上截圖。以下是我修改並新增了新功能後的效果圖:
是不是很酷,其實還蠻簡單的,下面就跟大家講講怎麼弄哈。
這裡主要分為三大塊功能,首先是第一個:
利用URL物件取得影片連結並展示:
js的URL物件有個createObjectURL 方法,它可以取得一個檔案(File物件)的url,然後插入到video 元素的src 特性中,這樣就可以實現視覺螢幕的展示了。當然如何取得File物件呢,方法有種,例如使用input元素,或是使用拖曳的方式。一個完整的程式碼段:
<input type=file/>document.querySelector('input[type=file]').addEventListener('change',function () { document.querySelector('video').src = window.URL.createObjectURL(this. files[0])})
當然源碼中我並不是這樣寫的,只是為了給大家一個演示而已。關於URL更具體的使用,大家可以看看這篇文章或是MDN。
利用canvas實現影片截圖:接下來就是關鍵步驟了,但也很簡單,那就是使用canvas 的drawImage 方法,大家如果翻到高程三的第15.2.6節,就會發現drawImage 的方法的使用描述得非常詳細,但漏講了一個,那就是video 元素也可傳入drawImage 方法中,並且繪製圖形。具體程式碼段:
var canvas = document.createElement(canvas);var canvasCtx = canvas.getContext(2d);var video=document.querySelector('video');//坐原影像的x,y軸座標,大小,目標影像的x ,y軸標,大小。 canvasCtx.drawImage(video, 0, 0, videoWidth, videoHeight, 0, 0, imgWidth, imgHeight);//把圖示base64編碼後變成一段url字串var dataUrl = canvas.toDataURL(image/png);//插入圖片得src特性中document.createElement('img').src=dataUrl;
繪製完成影像後,再呼叫canvas 的toDataURl 方法把影像變成base64 編碼的url,就可插入到img 元素中展示,一個縮略的圖的製作便完成了。關於圖片和base64的關係,具體的同學可以看這篇文章。
實現動畫效果:這個動畫實現的主要原理是:先在影片原處創建一張大小和影片一致的大圖片,設定為絕對佈局( position:absolut ),在實際放置縮圖處創建一張小圖片,設定為不可見( visibility:hidden ),然後大圖片透過left 和top 實現位移, width 和height 實現縮小,至實際放置縮圖處,並形成動畫效果。最後大圖片刪除,小圖片顯示即可。具體程式碼段:
function getOffset(elem) { var pos = {x: elem.offsetLeft, y: elem.offsetTop}; var offsetParent = elem.offsetParent; while (offsetParent) { pos.x += offsetParent.offsetParent; while (offsetParent) { pos.x += offsetParent.offsetParent; while.offsetParent) { pos.x += offsetParent.offsetParent; pos。 .offsetTop; offsetParent = offsetParent.offsetParent; } return pos;}
此函數是取得小圖片與viewport(視窗)的距離,並提供給大圖片作為位移參數的,高程三的12.2.3節有段幾乎一模一樣的程式碼,並附有詳細說明,以及替代方案getBoundingClientRect 函數也有提到,具體的大家翻書看看哈。
下面的程式碼便是創建大圖片和小圖片並實現動畫效果了。為了方便易懂,我這兒使用了JQuery
var $imgBig = $(<img/>);//設定大圖片的初始位置,就是原始影片處。 $imgBig.css({ position: absolute, left: video.offsetLeft, top: video.offsetTop, width: video.offsetWidth+ px, height: video.offsetHeight+ px}).attr(src, dataUrl);vareo. $(<img/>);$img.hide();//取得小圖片的距離參數,實現大圖片的動畫效果。 var offset = getOffset($img[0]);//增加動畫效果$imgBig.animate({ left: offset.x + px, top: offset.y + px, width: $img.width() + px, height: $img.height() + px}, 500, function () { $img.show(); $imgBig.remove();});
恩恩,主要的程式碼部分到這就講完啦,當然具體的實現還有很多細節上的問題以及其他的功能可能沒有展示,我就不一一說明了,具體的大家看完源碼後可以再提問。
下面是我的源碼位址,大家可以試試哈:
在github上的demo
總結以上所述是小編跟大家介紹的video結合canvas實現影片線上截圖功能,希望對大家有幫助,如果大家有任何疑問請給我留言,小編會及時回覆大家的。在此也非常感謝大家對VeVb武林網站的支持!