节点js中的像素化图像

时间:2016-11-27 20:40:06

标签: node.js image imagemagick pixelate

我现在正在做的是,我正在使用var getPixels = require("get-pixels")获取所有像素,然后使用此代码循环遍历像素数组:

var pixelation = 10;
var imageData = ctx.getImageData(0, 0, img.width, img.height);
var data = imageData.data;

for(var y = 0; y < sourceHeight; y += pixelation) {
    for(var x = 0; x < sourceWidth; x += pixelation) {
        var red = data[((sourceWidth * y) + x) * 4];
        var green = data[((sourceWidth * y) + x) * 4 + 1];
        var blue = data[((sourceWidth * y) + x) * 4 + 2];

        //Assign
        for(var n = 0; n < pixelation; n++) {
            for(var m = 0; m < pixelation; m++) {
                if(x + m < sourceWidth) {
                    data[((sourceWidth * (y + n)) + (x + m)) * 4] = red;
                    data[((sourceWidth * (y + n)) + (x + m)) * 4 + 1] = green;
                    data[((sourceWidth * (y + n)) + (x + m)) * 4 + 2] = blue;
                }
            }
        }

    }
}

此方法的问题是结果图像太尖锐。 enter image description here

我正在寻找的东西,类似于使用ImageMagick -sale完成的那个

enter image description here

我用于第二个的命令是

convert -normalize -scale 10% -scale 1000% base.jpg base2.jpg

这种方法的问题是我不知道如何指定实际的像素大小。

因此可以通过for循环获得第二个结果。或者最好使用imagemagick -scale,但如果有人可以帮助进行数学计算,那么我可以将实际的像素大小设置得很好。

2 个答案:

答案 0 :(得分:2)

不确定你正在努力学习什么数学,但如果我们从这样的600x600图像开始:

enter image description here

然后,如果您希望最终图像在页面上只有5个块像素和5个块像素,则可以将其缩小到5x5,然后将其缩放回原始大小:

convert start.png -scale 5x5 -scale 600x600 result.png

enter image description here

或者,如果你想转到10x10块像素:

convert start.png -scale 10x10 -scale 600x600 result2.png

enter image description here

答案 1 :(得分:0)

您编写此图片的方式,图片会被处理为大小为nxn的像素,其中n变量指定了pixelation。增加pixelation将提供所需的“粗糙度”。