

抠图结果

抠图代码实现
<!DOCTYPE html>
<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="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>
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
maskCtx.drawImage(maskImg, 0, 0)
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];
maskData.data[i + 3] = r
}
maskCtx.putImageData(maskData, 0, 0)
checkLoading()
}
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()
}
function checkLoading() {
if(maskLoaded && sourceLoaded) {
const resultCanvas = document.getElementById('canvas');
resultCanvas.width = sourceImg.width;
resultCanvas.height = sourceImg.height;
const resultCtx = resultCanvas.getContext('2d');
resultCtx.drawImage(maskCanvas, 0, 0);
resultCtx.globalCompositeOperation = 'source-in';
resultCtx.drawImage(sourceCanvas, 0, 0);
}
}
</script>
</body>
</html>
参考资料