Canvas 图片处理
Canvas 可处理的图片源
通过 Image()创建的对象
通过 ImageBitmap()创建的对象
dom 元素
dom 元素
dom 元素
Canvas 图片 API
drawImage
获取到图片源后,可以调用这个方法将图片源绘制到 canvas 中
drawImage(image, x, y)
image 是 image 或者 canvas 对象,x 和 y 是其在目标 canvas 里的起始坐标。
rotate
用于以原点为中心旋转 canvas 画板
ImageData
ImageData 对象中存储着 canvas 对象真实的像素数据,它包含以下几个只读属性:
width: 图片宽度,单位是像素 height: 图片高度,单位是像素 data: Uint8ClampedArray 类型的一维数组,包含着 RGBA 格式的整型数据,范围在 0~255
变形
缩放/裁切
缩放 drawImage(image, x, y, width, height)
width 和 height,这两个参数用来控制 当向 canvas 画入时应该缩放的大小
切片 drawImage(image, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight)
sx, sy, sWidth, sHeight 是图片源的坐标/宽高信息
dx, dy, dWidth, dHeight 是绘制到 canvas 的坐标/宽高信息
旋转
// 将参照点移动到画板的中心点;
ctx.translate(ctx.width / 2, ctx.height / 2);
// 旋转画板;
ctx.rotate = 90;
// 绘制图片;
ctx.drawImage(img);
图片效果
反色
反色即对每个像素点进行如下操作,公式:
b = 255 - a;
JS 代码
const imageData = cxt.getImageData(0, 0, canvas.width, canvas.height);
const imageData_length = imageData.data.length / 4; //一个像素点用4位:r,g,b,a
// 解析之后进行算法运算
for (let i = 0; i < imageData_length; i++) {
imageData.data[i * 4] = 255 - imageData.data[i * 4];
imageData.data[i * 4 + 1] = 255 - imageData.data[i * 4 + 1];
imageData.data[i * 4 + 2] = 255 - imageData.data[i * 4 + 2];
}
cxt.putImageData(imageData, 0, 0);
去色
去色即将彩色图片变成黑白图片
公式:
Gray = Red * 0.3 + Green * 0.59 + Blue * 0.11;
JS 代码
const imageData = cxt.getImageData(0, 0, canvas.width, canvas.height);
const imageData_length = imageData.data.length / 4;
// 解析之后进行算法运算
for (let i = 0; i < imageData_length; i++) {
const red = imageData.data[i * 4];
const green = imageData.data[i * 4 + 1];
const blue = imageData.data[i * 4 + 2];
const gray = 0.3 * red + 0.59 * green + 0.11 * blue;
imageData.data[i * 4] = gray;
imageData.data[i * 4 + 1] = gray;
imageData.data[i * 4 + 2] = gray;
}
cxt.putImageData(imageData, 0, 0);
单色
单色处理即将图片变为纯 red/green/blue 的纯色图,操作即将其余两色位 置为 0
二值处理
二值处理是非纯黑即纯白,在验证码 ocr 时,常用二值处理先处理,再将图片进行 ocr
算法是给定一个设置值,如果进行去色处理的结果高于这个值,就将颜色设为 255,否则设为 0
最后更新于
这有帮助吗?