【发布时间】:2022-01-10 05:18:56
【问题描述】:
我有一张图片,中间有一个红色的实心圆圈。我想读取该图像,分析像素,然后仅使用圆圈的轮廓将其写回画布。所以我正在检查像素是否被红色通道值为 255 的像素包围。如果是,我将其设为透明。如果不是,我将像素着色为青色。
我使用this post,作为编写脚本的参考。
我做错了什么。它不是用青色勾勒圆圈,并使中心透明,而是将所有白色像素着色为青色。
非常感谢您的帮助!
代码:
<img alt="input" height="170" id="input" src="img/input.png" width="170">
<canvas height="170" id="myCanvas" style="border:1px solid #d3d3d3;" width="170"></canvas>
let neighbors = []
function isSurrounded(index, imageData, data) {
neighbors = [] // clear array
neighbors[0] = data[index - imageData.width * 4 - 4] // Upper left
neighbors[1] = data[index - imageData.width * 4] // Upper middle
neighbors[2] = data[index - imageData.width * 4 + 4] // Upper right
neighbors[3] = data[index - 4] // left
neighbors[4] = data[index + 4] // right
neighbors[5] = data[index + imageData.width * 4 - 4] // Lower left
neighbors[6] = data[index + imageData.width * 4] // lower middle
neighbors[7] = data[index + imageData.width * 4 + 4] // Lower right
// check red channel
for (let i = 0; i < neighbors.length; i++) {
let redPixel = neighbors[i]
if (redPixel !== 255) {
return false
}
}
return true
}
let img = document.getElementById("input")
img.onload = function () {
let c = document.getElementById("myCanvas")
let ctx = c.getContext("2d")
ctx.drawImage(img, 0, 0)
let imgData = ctx.getImageData(0, 0, c.width, c.height)
let pxl = imgData.data
for (let i = 0; i < pxl.length; i += 4) {
if (isSurrounded(i, imgData, pxl)) {
pxl[i] = 0
pxl[i + 1] = 255
pxl[i + 2] = 255
pxl[i + 3] = 255
} else {
pxl[i + 3] = 0
}
}
ctx.putImageData(imgData, 0, 0)
}
【问题讨论】:
标签: javascript image-processing html5-canvas pixel