原生 js 实现 canvas 图片转黑白功能
<!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>黑白功能</title>
</head>
<body>
<!-- 上传 -->
<div style="display: flex;">
<canvas id="oldCanvas" width="842" height="595"></canvas>
<span style="margin:50px 10px;"><- 原图</span>
<span style="margin: 50px 10px;">改变后的图 -></span>
<canvas id="nowCanvas" width="842" height="595"></canvas>
</div>
<div style="margin-top: 10px;">
<input id="img-input" type="file" accept="image/*" onchange="onImageUpload()" />
<button onclick="balckAndWhite()">黑白功能</button>
<button onclick="saveImage()">保存图片</button>
</div>
</body>
<script>
let imgInput = document.querySelector('#img-input');
let oldcanvas = document.getElementById('oldCanvas');
let oldcontext = oldcanvas.getContext('2d');
let nowcanvas = document.getElementById('nowCanvas');
let nowcontext = nowcanvas.getContext('2d');
let drawName = '';
var image = new Image();
function onImageUpload() {
const file = imgInput.files[0];
image.src = '';
drawName = file ? file.name : '';
let reader = new FileReader();
file && reader.readAsDataURL(file);
reader.onload = function (e) {
let result = e.target.result
image.src = result
image.onload = function () {
oldcontext.drawImage(image, 0, 0, oldcanvas.width, oldcanvas.height)
}
}
}
function balckAndWhite() {
var imgdata = oldcontext.getImageData(0, 0, oldcanvas.width, oldcanvas.height);
for (var i = 0; i < imgdata.data.length; i += 4) {
var avg = (imgdata.data[i] + imgdata.data[i + 1] + imgdata.data[i + 2]) / 3;
imgdata.data[i] = avg;
imgdata.data[i + 1] = avg;
imgdata.data[i + 2] = avg;
}
nowcontext.putImageData(imgdata, 0, 0);
}
function saveImage() {
const img = nowcanvas.toDataURL("image/png");
const link = document.createElement('a');
if(drawName.indexOf('.jpg') > -1){
drawName = drawName.replace('.jpg','.png')
}
link.download = drawName;
link.href = img;
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
}
</script>
<style>
canvas{
border: 1px solid;
}
body{
background-color: #CCC;
}
</style>
</html>