h5 canvas 视频透明度抠图,视频需要一个灰度通道副本表示透明度
视频透明度抠图,视频需要一个灰度通道副本表示透明度
目前抖音等直播平台的礼物特效就是这个方法处理的
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>视频灰度通道抠图,视频包含灰度值表示透明的副本</title>
<style>
html, body {
::-webkit-scrollbar {
display: none;
};
background:rgba(0,0,0, 0); } div {
padding:0px;
margin: 0px;
} #c1 {
opacity: 0.001;
position:absolute;
left:0;
top:0;
z-index:0;
}
#c2 {
opacity: 1;
position:absolute;
left:0;
top:0;
z-index:3; } </style>
</head> <body style="background:url(bg.jpg)"> <div style="position:absolute;top:80px;left:0px;z-index:0;opacity:0.001">
<video width="555" height="777"
id="video"
src="media/789.dll"
controls="true"
crossorigin="anonymous" autoplay muted/>
</div> <canvas id="c1" width="1440" height="1280"></canvas>
<canvas id="c2" width="720" height="1280"></canvas> <input type='button' value="---change role---" style=" height:58px;position:absolute;top:122px;left:0px;z-index:99;"
onclick='setRole(805)'></input> <script> const tolerance = 5;
var roleId=1; function setRole(id){
var video = document.getElementById("video");
video.src='media/'+id+'.dll?'+new Date().getTime();
processor.c2.style.opacity=1;
// video.play();
//idle(); } function hideLayer()
{ processor.c2.style.opacity=0; } let processor = {
timerCallback: function() {
if (this.video.paused || this.video.ended) {
console.log("video.ended");
this.c2.style.opacity=0;
return;
}
this.computeFrame();
let self = this;
setTimeout(function () {
self.timerCallback();
}, 0);
}, doLoad: function() {
this.video = document.getElementById("video");
this.c1 = document.getElementById("c1");
this.ctx1 = this.c1.getContext("2d", { willReadFrequently: true });
this.c2 = document.getElementById("c2");
this.ctx2 = this.c2.getContext("2d", { willReadFrequently: true });
let self = this;
this.video.addEventListener("play", function() {
self.width = self.video.videoWidth ;
self.height = self.video.videoHeight;
self.c2.style.width= self.width / 2;
self.c1.style.width= self.width;
console.log("w=" + self.video.videoWidth); self.timerCallback();
}, false);
}, computeFrame: function() {
if(this.width<=0){
console.log("width:"+this.width);
return;
}
this.ctx1.drawImage(this.video, 0, 0, this.width, this.height);
let frameOpcity= this.ctx1.getImageData(this.width / 2, 0, this.width / 2, this.height);
let frame = this.ctx1.getImageData(0, 0, this.width / 2, this.height); let l = frame.data.length / 4; for (let i = 0; i < l; i++) {
let r = frame.data[i * 4 + 0];
let g = frame.data[i * 4 + 1];
let b = frame.data[i * 4 + 2];
let a= (r+ g+ b) / 3;
frameOpcity.data[i * 4 + 3] = a; } this.ctx2.putImageData(frameOpcity, 0, 0);
return; }
} document.addEventListener("DOMContentLoaded", () => {
processor.doLoad();
}); </script> </body>
</html>
h5 canvas 视频透明度抠图,视频需要一个灰度通道副本表示透明度的更多相关文章
- H5 的直播协议和视频监控方案
H5 的直播协议和视频监控方案 一.流媒体主要实现方式 二.流媒体技术 2.1 流媒体 2.2 直播 2.3 流协议 2.3.1 HLS 协议 2.3.2 RTMP 协议 2.3.3 RTSP 协议 ...
- canvas与html5实现视频截图功能
这段时间一直在研究canvas,突发奇想想做一个可以截屏视频的功能,然后把图片拉去做表情包,哈哈哈哈哈哈~~ 制作方法: 1.在页面中加载视频 在使用canvas制作这个截图功能时,首先必须保证页面上 ...
- paper 116:自然图像抠图/视频抠像技术梳理(image matting, video matting)
1. Bayesian Matting, Chuang, CVPR 2001.http://grail.cs.washington.edu/projects/digital-matting/paper ...
- EasyNVR网页H5无插件播放摄像机视频功能二次开发之直播通道接口保活示例代码
背景需求 随着雪亮工程.明厨亮灶.手机看店.智慧幼儿园监控等行业开始将传统的安防摄像头进行互联网.微信直播,我们知道摄像头直播的春天了.将安防摄像头或NVR上的视频流转成互联网直播常用的RTMP.HT ...
- PyQt+moviepy音视频剪辑实战2:一个剪裁视频文件精华内容留存工具的实现
专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 PyQt+moviepy音视频剪辑实战 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 一.引言 ...
- 用H5 Canvas绘制一个仪表盘笔记
前端有许多做数据可视化的图表插件,但有时候UI设计的图可能用现成的js插件无法定制或者比较麻烦(还不如自己造轮子来的快). 下面记录下用H5 canvas设计一个仪表盘代码: <!DOCTYPE ...
- moviepy音视频剪辑:视频基类VideoClip子类VideoFileClip、CompositeVideoClip、ImageSequenceClip介绍
☞ ░ 前往老猿Python博文目录 ░ 一.引言 在<moviepy音视频剪辑:moviepy中的剪辑相关类及关系>介绍了VideoClip主要有六个直接子类(VideoFileClip ...
- moviepy音视频剪辑:视频基类VideoClip子类DataVideoClip、UpdatedVideoClip、ImageClip、ColorClip、TextClip类详解
☞ ░ 前往老猿Python博文目录 ░ 一.概述 在<moviepy音视频剪辑:moviepy中的剪辑相关类及关系>介绍了剪辑相关类及关系,其中VideoClip有多个直接子类和间接子类 ...
- moviepy音视频剪辑:视频剪辑基类VideoClip的属性及方法详解
☞ ░ 前往老猿Python博文目录 ░ 一.概述 在<moviepy音视频剪辑:moviepy中的剪辑基类Clip详解>和<moviepy音视频剪辑:moviepy中的剪辑基类Cl ...
- C#控制台程序取得INSOYA视频区的视频的真实URL,视频标题,发布时间集合。
准备工作 起因是因为这个网站:http://i.youku.com/kmsfan 这个是一个叫做冒险岛的游戏的资讯论坛,以前我经常在里面传视频,现在我不玩这个游戏了,但是很多玩家还是经常到我的网站里面 ...
随机推荐
- 在使用asm包进行动态类加载的时候的打包问题
如图所示,开发时使用的jdk包下面的asm包,在进行打包时提示asm包不存在,打包方式使用如下: 目前提供两种解决方案: 1:修改打包方式,将jdk的包也打进去: <plugin> < ...
- PhpStorm 中切换PHP8以上报错 VCRUNTIME140.dll 与PHP 版本不兼容
错误原因:PhpStorm 附带了旧版本或错误版本的vcruntime140.dll 解决方法: 打开PhpStorm VCRUNTIME140 存在目录 C:\Program Files\JetB ...
- 鸿蒙NEXT开发案例:转盘
[1]引言(完整代码在最后面) 在鸿蒙NEXT系统中,开发一个有趣且实用的转盘应用不仅可以提升用户体验,还能展示鸿蒙系统的强大功能.本文将详细介绍如何使用鸿蒙NEXT系统开发一个转盘应用,涵盖从组件定 ...
- 使用wxpython开发跨平台桌面应用,动态工具的创建处理
在我们开发系统的时候,往往需要一个很容易理解功能的工具栏,工具栏是一个系统的快速入口,美观易用的工具栏是可以给系统程序增色不少的,本篇随笔介绍在使用wxpython开发跨平台桌面应用,工具栏的动态展现 ...
- 低功耗4G模组:MQTT通信功能
今天我们来学习使用合宙Air708E开发板的MQTT通信基本功能. 一.MQTT介绍 MQTT是一种低开销.低带宽占用的即时通讯协议,可以用极少的代码和带宽为远程设备提供实时可靠的消息服务.它适用 ...
- Metasploit会话连接不稳定问题排查
使用msfvenom生成木马,语句如下: msfvenom -p windows/x64/meterpreter_reverse_tcp lhost=43.154.xxx.xxx lport=4455 ...
- PA1-总结
前言 代码全是自己写的,没看过参考代码,思路也有部分和指导书不一样,算是个原创?然后毕竟pa1是简单的部分,也没有什么值得骄傲的地方,只是作为一次记录. 毕竟自己的水平还是有限,可能部分地方会有些bu ...
- canvas 隐写术
http://www.alloyteam.com/2016/03/image-steganography/#prettyPhoto https://www.cnblogs.com/Miracle-ZL ...
- Django消息队列之django-rq
github:https://github.com/rq/django-rq RQ(Redis Queue),人如其名,用 redis 做的队列任务 redis ,众所周知, 它的列表可以做队列,rq ...
- stylus图床