资源收集:
书签栏注入JS工具,截获截图,作为帧素材备用。
(function(){
if(!window.$ || !$.getUrlParam) return alert('环境不对头,不能使用。');
var qihoo_playerEl = $("#qihoo_player")[0];
if(!qihoo_playerEl) return alert('已经废弃了~');
var ipcData = (window.playInfo && window.playInfo.origin) || { sn:$.getUrlParam('sn') };
var sn = ipcData.sn;
if(!sn) return alert('没有取到SN号,无法继续。');
//设定关键帧采集间隔时长数
var delayTime = prompt('请设定关键帧采集间隔时长数(秒,10-N)',30);
if(isNaN(delayTime) || delayTime<1){
return alert('无效帧间隔时长'+(delayTime<1?'(这是生成定格动画的,不是录像,所以时间不能太短)':'')+',还想玩从新来过吧!');
}
delayTime *= 1000;
//设定帧数
var frameCount = prompt('请设定要采集的关键帧总数(10-50)',10);
if(isNaN(frameCount) || frameCount<1){
return alert('无效帧总数,还想玩从新来过吧!');
}
///if(frameCount>100)return alert('你要疯啊? 帧数太多会搞死的...');
var pr = '';
//监控被移动到后台则提示
document.addEventListener("visibilitychange", function(e){
if(document.visibilityState=='hidden'){
document.title='[页面已切换到后台,可能无法正常截图]';
}else{
document.title=pr;
}
});
var _fCount = 0, _date = new Date(), tit = ipcData.titlePub || $(".title").text()||sn;
/* 截屏上传图片 */
function startUpload(){
qihoo_playerEl.uploadScreenshotImg({
url: 'http://'+(window._s_h_1?'1.':'')+'huzj.sinaapp.com/gif/upload.php',
from: tit,
sn: sn
});
_fCount ++;
pr = document.title='截图进度:'+(Math.round(_fCount/frameCount*100))+'% ('+(_fCount+'/'+frameCount)+')';
/* 输出进度日志 */
console.log("计划获取总帧数:"+frameCount, '当前截取第'+_fCount+'帧', ' 已耗时(秒):'+ Math.round( (new Date() - _date)/1000 ),' 效果预览:','http://huzj.sinaapp.com/gif/index.html?sn='+sn+'&step=1&acount='+_fCount );
if(_fCount<frameCount){
setTimeout(startUpload, delayTime);
}else{
alert('已完成摄像机['+tit+']的截图');
}
}
startUpload();
})();
加工处理:
基于一个用 CoffeeScript 编写的gif处理库 gif.js,
合成为BLOB形式的GIF文件。
/*** gif.js使用方法 ***/
// 实例化一个GIF对象
var gif = new GIF({
workers: 2,
quality: 10
});
// 通过img元素对象来创建帧
gif.addFrame(imageElement);
// 通过canvas元素对象创建帧 示例:http://jnordberg.github.io/gif.js/tests/canvas.html
gif.addFrame(canvasElement, {delay: 200});
// 通过canvas上下文对象创建帧
gif.addFrame(ctx, {copy: true});
// 通过video当前画面创建帧 示例:http://jnordberg.github.io/gif.js/tests/video.html
gif.addFrame(videoElement, {copy: true});
// GIF生成完毕后通过异步事件监听做相应处理
gif.on('finished', function(blob) {
window.open(URL.createObjectURL(blob));
});
// 渲染GIF图
gif.render();
文件保存:
URL.createObjectURL( BLOB ) 生成GIF URL,输出到页面;
并使用A标签的download属性,自定义GIF文件名称。
实现工具雏形。
/*** gif 存储 ***/
// GIF生成完毕后通过异步事件监听做相应处理
gif.on('finished', function(blob) {
var blobUrl = URL.createObjectURL(blob);
retBoxEl.innerHTML = '<a href="'+blobUrl+'" download="水滴直播['+sn+']动态图.gif">'+
'<img src="'+blobUrl+'">'+
'</a>';
});
图片资源加载成功
drawImage 绘制
图片到canvas上
getImageData 从canvas取得帧图像的像素矩阵数据
new Worker
启动子进程
addFrame
逐帧将imageData
post给子进程 render
子进程完成24位色到
8位色的计算转换
将ArrayBuffer
回传给主进程
使用Blob API 创建
image/gif 图片文件
postMessage
postMessage
UI和具体需求有了,接下来考虑功能的实现
先看下代码,再继续往下看PPT总结