在某些情况下,某些图片周边的背景都是白色或者其他颜色,我们期望它们是透明的,但这些图片是动态获取的,无法直接交给UI处理成透明样式。而通过javascript的方式,利用颜色RGBA的原理,我们也可以像PS那样,实现取色,替换等功能。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
| <!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>Document</title> <style> #canvas { position: absolute; left: 10px; top: 10px; } </style> </head>
<body> RGBA的解释 我们知道图片由很多个像素点组成的,每个像素点都有颜色,而颜色是由三基色RGB构成。而A是Alpha通道,用作不透明度参数,0%为完全透明,100%是完全不透明。所以说如果我们想实现白色背景的JPEG 图片转成透明的 PNG 图片,只需要将白色背景对应的像素点得Alpha值变成0就好了。<br> <canvas id="canvas"></canvas> </body> <script>
var img = new Image(); img.src = "你的图片地址,该地址跨域会导致canvas方式出错" img.onload = function () { let width = img.width let height = img.height let canvas = document.getElementById("canvas"); canvas.width = width; canvas.height = height; let ctx = canvas.getContext('2d'); ctx.drawImage(img, 0, 0, width, height) let imageData = ctx.getImageData(0, 0, width, height) let data = imageData.data
for (let i = 0; i < data.length; i += 4) { let r = data[i] , g = data[i + 1] , b = data[i + 2] if ([r, g, b].every(v => v < 256 && v > 245)) data[i + 3] = 0.1 } ctx.putImageData(imageData, 0, 0) var imgSrc = canvas.toDataURL(); }
</script>
</html>
|