0%

Canvas中像素级别ImageData缩放

弄Web端手写数字识别的时候要把Canvas缩成32*32大小的,刚开始想的是用canvas的画布缩放,弄了好久发现行不通,然后无意中发现可以获得每个像素的RGBA的值,然后又自己尝试每个像素缩放,语法不熟悉,各种尝试…
好了不多说了,代码在下面

Canvas中对ImageData数据缩放

  • ctx: 原始canvas的context
  • outCtx: 输出canvas的context
  • scale: 缩放倍数
  • scaled: 缩放后的ImageData
  • imageData.data: 图像的RGBA数组,是一个一维数组
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
function genImg() {
var imgData = ctx.getImageData(0,0,500,500);
outCtx.putImageData(scaleImageData(imgData,0.5),0,0);
}

function scaleImageData(imageData, scale) {
var scaled =
outCtx.createImageData(imageData.width * scale, imageData.height * scale);
for (var row = 0; row < imageData.height; row++) {
for (var col = 0; col < imageData.width; col++) {
var sourcePixel = [
imageData.data[(row * imageData.width + col) * 4 + 0],
imageData.data[(row * imageData.width + col) * 4 + 1],
imageData.data[(row * imageData.width + col) * 4 + 2],
imageData.data[(row * imageData.width + col) * 4 + 3]
];
for (var y = 0; y < scale; y++) {
var destRow = Math.floor(row * scale) + y;
for (var x = 0; x < scale; x++) {
var destCol = Math.floor(col * scale) + x;
for (var i = 0; i < 4; i++) {
scaled.data[(destRow * scaled.width + destCol) * 4 + i] = sourcePixel[i];
}
}
}
}
}
return scaled;
}

主要就是scaleImageData这个函数,原型是stackoverflow上的,不过有bug,自己修改了下。
遇到问题果然还是要看源码…