เนื่องจากมีความสงสัยว่า JavaScript นั้นสามารถ capture vdo และ สามารถสร้างไฟล์ gif animation ได้หรือไม่ จึงไปศึกษาหาข้อมูลมาดู สรุปคือสามารถทำได้ จึงมาลองเขียนเป็นโปรแกรมแบบง่ายๆเพื่อศึกษาและเขียนบทความเก็บไว้เผื่อมีงานทำเว็บที่ต้องใช้ในอนาคต
เรามาดูตัวอย่างกันครับ กดที่นี่เพื่อดูเต็มจอ
จากโปรแกรมเราจะใช้ js library 2 อันคือ
1 jQuery ทำหน้าที่ในการคุม event กัน dom
2 gif.js (https://github.com/jnordberg/gif.js) สำหรับสร้าง gif file
ขั้นตอนการทำงานของโปรแกรมนี้มีอยู่ 3 ขั้นตอน (ผมจะแยก code แต่ละขั้นตอนออกจากกัน)
1 ผู้ใช้อัปโหลด vdo
– ส่วน html input file สำหรับผู้ใช้ upload vdo
<input type="file" name="file" class="vdoupload" accept="video/*">
– ส่วน html แสดงผล vdo หลังจาก upload
<video width="400" controls " id="video"> <source src="mov_bbb.mp4" id="video_show"> Your browser does not support HTML5 video. </video>
– ส่วน javascript ในการควมคุม event (เมื่อผู้ใช้กดปุ่มและเลือกไฟล์) จากนั้นนำ ไฟล์ที่เลือกไปแสดงผลใน tag video
$(".vdoupload").change(function (){ // jQuery event on change var $source = $('#video_show'); // Select ID video_show $source[0].src = URL.createObjectURL(this.files[0]); // นำไฟล์ที่ upload มาแสดงใน html tag vdo $source.parent()[0].load(); $(".showcap,.showgif").html(""); // ล้างข้อมุลการแสดงผลขั้นตอนที่ 2 กับ 3 });
2 เมื่อผู้ใช้เลื่อน vdo และ กดปุ่ม capture เพื่อสร้างภาพนิ่ง
– ส่วน html ปุ่ม capture
<button class="capture">Capture</button>
– ส่วน html element แสดงผลรูปที่ได้จากการกดปุ่ม capture
– ส่วน javascript ในการควบคุมปุ่ม capture และ นำรูปภาพที่ได้ไปแสดงใน html element class showcap
$(".capture").click(function (){ // จับ event เมื่อปุ่ม capture ถูกกด var video = $('video')[0]; // select element video มาเก็บไว้ในตัวแปร var ra = 1; // ตัวแปรสัดสวนในการย่อรูป if(video.videoWidth>500){ // ถ้าขนาด vdo มีขนาดกว่ากว่า 500 ให้สัดส่วน 50% ra = .5; } var $ctx = $( '<canvas />', {width:video.videoWidth*ra, height:video.videoHeight*ra} ); // jQuery สร้าง cavans ขึ้นมา $ctx[0].getContext('2d').drawImage(video, 0, 0, video.videoWidth*ra, video.videoHeight*ra); // นำรูปจาก vdo ไปใส่ใน cavans $(".showcap").append($ctx) // เพิ่ม cavans เข้าไปใน element showcap });
3 เมื่อผู้ใช้กดปุ่ม GIF ANIMATION
– html ปุ่ม gif animation
<button class="gengif">GIF ANIMATION</button>
– JavaScript สำหรับปุ่ม gif animation
$(".gengif").click( function (){ // event เมื่อกดปุ่ม var gif = new GIF({ // สร้าง object gif ใช้ gif.js workers: 2, quality: 10 }); // loop canvas (รูปภาพที่ได้จากการ capture) $( "canvas" ).each(function( i,val ) { gif.addFrame($(this)[0], {copy: true}); // นำรูปภาพที่ได้จากการ capture ใส่ไปใน gif object }); gif.on('finished', function(blob) { // callback function หลังจากสร้าง gif เสร็จ var urlCreator = window.URL || window.webkitURL; var imageUrl = URL.createObjectURL(blob); // ไฟล์ gif ที่เสร็จแล้ว var video = $('video')[0]; var image = $( '<img />', {width:video.videoWidth*.5, height:video.videoHeight*.5,src:imageUrl} ); // สร้าง html tag image ขี้นมา $(".showgif").html(image); // นำ gif image มาแสดงใน element }); gif.render(); });
เท่านี้เราก็ได้ไฟล์ gif animation จาก capture vdo ครับ
สามารถ Download ไปศึกษากันได้ครับ