canvas 实现抠像效果 - 浏览器
最编程
2024-05-05 12:20:31
...
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>canvas-抠图测试</title>
</head>
<body>
<!-- 商品 -->
<!-- <img id='mask' width="1024" height="682" crossOrigin src="https://matting-batch.dancf.com/matting/f11d26c1611613be-20220315154323636.png" />
<img id='source' width="1024" height="682" crossOrigin src="https://gd-filems.dancf.com/gaoding/gaoding/56406/f02eaf63-f3bb-49ac-b7ce-5b2c0de9d4ce35398314.jpg"/> -->
<!-- 人像 -->
<img id='mask' width="1000" height="1000" crossOrigin src="https://matting-batch.dancf.com/matting/7ab866edd2699a38-20220315171838594.png" />
<img id='source' width="1000" height="1000" crossOrigin src="https://matting-batch.dancf.com/yunzheng/test/passport.jpg"/>
<canvas id="canvas"></canvas>
<script>
// 创建一个 canvas 用来绘制 mask 图片
const maskCanvas = document.createElement('canvas');
const maskCtx = maskCanvas.getContext('2d');
maskCanvas.width = maskImg.width;
maskCanvas.height = maskImg.height;
// 图片加载完毕标识
let maskLoaded = false;
const maskImg = document.getElementById('mask');
// 当页面加载完毕后,图片开始加载时,开始画布绘制
maskImg.onload = function() {
maskLoaded = true
// drawImage() 不支持直接传入 uint8Array、uint8ClampedArray 等像素矩阵数据
maskCtx.drawImage(maskImg, 0, 0)
// 获取图片的 imageData, imageData 的数据本身是像素点组成的数组 uint8ClampedArray, 结构为[R,G,B,A,R,G,B,A,...]
let maskData = maskCtx.getImageData(0,0, maskCanvas.width, maskCanvas.height)
for(let i = 0; i < maskData.data.length; i+= 4) {
const r = maskData.data[i];
// 修改 alpha 通道值,使得黑色区域透明,方便合图操作
maskData.data[i + 3] = r
}
// 将修改后的像素矩阵重新绘制到画布上
maskCtx.putImageData(maskData, 0, 0)
checkLoading()
}
// 创建一个 canvas 来绘制原图
const sourceCanvas = document.createElement('canvas');
const sourceCtx = sourceCanvas.getContext('2d');
const sourceImg = document.getElementById('source')
sourceCanvas.width = sourceImg.width;
sourceCanvas.height = sourceImg.height;
let sourceLoaded = false
sourceImg.onload = function() {
sourceLoaded = true
sourceCtx.drawImage(sourceImg, 0, 0)
checkLoading()
}
// 确认原图和 mask 图已加载,进行抠图操作
function checkLoading() {
if(maskLoaded && sourceLoaded) {
const resultCanvas = document.getElementById('canvas');
resultCanvas.width = sourceImg.width;
resultCanvas.height = sourceImg.height;
const resultCtx = resultCanvas.getContext('2d');
// 将 mask 画布内容绘制到新画布上
resultCtx.drawImage(maskCanvas, 0, 0);
// 关键步骤: 组合操作
resultCtx.globalCompositeOperation = 'source-in';
// 将原图画布内容绘制到新画布上
resultCtx.drawImage(sourceCanvas, 0, 0);
}
}
</script>
</body>
</html>
推荐阅读
-
canvas 实现抠像效果 - 浏览器
-
html5 canvas+js 实现 ps 笔抠字(快速抠字 www.sukoutu.com)
-
基于 OpenCV-python3 的抠像实现
-
使用画布实现抠像部件
-
5 行 Python 代码实现一键视频抠像
-
javascript - 前端如何实现与 Chrome 浏览器相同的百分比缩放效果?-PHP.cn问答
-
人工智能目标分割功能可实现快速视频抠像,无需绿色屏幕
-
Adobe国际认证中文官方网站】Adobe中国摄影计划,免费安装正版激活--Adobe Creative Cloud中国摄影计划。与此同时,Adobe宣布天猫为Adobe Creative Cloud中国摄影计划的电商战略合作伙伴,并将与其合作上线Adobe天猫官方旗舰店。 此举无疑一方面扩大了Adobe在中国的影响力,另一方面也有助于国内用户更好地培养正版软件意识,推动Adobe软件在中国的正版化进程。 网络异常,图片无法显示 ||网络异常 Adobe Creative Cloud中国摄影计划包括Photoshop和Lightroom Classic两大桌面创意工具,以及iOS版Photoshop Express。 其中,Adobe Lightroom Classic和Adobe Photoshop作为两款常用的图像处理软件,对于那些玩摄影、后期修图的创意设计人群无疑有着巨大的帮助,而LR+PS套装对于摄影领域用户的重要性自不必说,正版产品的性能实时更新也可以放心!体验最新功能,对于新镜头(补偿)和机身(RAW 读取)都能第一时间适应。不信你看: Photoshop 图像合成 裁剪、移除对象、润饰合成照片、玩转色彩和特效,创建精美图片和艺术品! Lightroom Classic 照片编辑 轻松批量管理和编辑照片,内置专业创意控件和摄影师预设,让你的照片大放异彩。 手机 PS 便捷编辑 Photoshop Express 支持多种滤镜、贴纸,手机即可完成抠图、除雾等任务 人工智能编辑工具 神经滤镜、快速点击选区、自动选择主题等人工智能功能让图像编辑更轻松 创意画笔内容识别 定制艺术画笔工具,实现个性化效果;内容识别填充,智能去除无用物体。 Adobe Creative Cloud 中国摄影计划的推出,为中国的专业摄影师、摄影爱好者、后期修图和其他创意设计人员带来了全方位的内容和体验。 网络异常,图片无法显示 ||网络异常 当然,不可否认的是,"由于盗版软件缺乏开发、维护和升级成本,销售价格远低于正版软件。再加上很多普通人并不需要使用正版软件的复杂功能,版权观念较淡,还是有大量的创意设计人员会选择盗版软件"。 但事实上,当所有的软件都不再是单一的软件,而是变成一种服务时,单机版盗版的存在就逐渐成为鸡肋。因为有太多的服务让你即使是所谓的 "完美破解",也无法享受,Adobe Cloud 就是一个很好的例子,所谓的完美破解,你只能使用 "Adobe "的一半,对于更精彩的 "云",只能望云兴叹。更何况,越来越多的设计工具从免费走向付费,越来越多的设计师和企业已经接受了付费使用的模式。 其次,对于互联网时代的企业数字化转型而言,数字化合规至关重要。21年来,使用盗版PS和未经授权的方正字体被指侵权的事情闹得沸沸扬扬,虽然新闻真假难辨,但也给使用盗版工具的用户敲响了警钟。 付费使用正版工具,可以更放心地进行设计,不用担心版权风险!
-
全新创作:实操Canvas动画技巧 - 倒计时效果的呈现与实现
-
在vue3中使用canvas实现雨滴效果