HTML5 canvas: is there a way to resize image with “nearest neighbour” resampling?

后端 未结 5 1693
天涯浪人
天涯浪人 2021-02-01 09:41

I have some JS that makes some manipulations with images. I want to have pixelart-like graphics, so I had to enlarge original images in graphics editor. But I think it\'d be goo

5条回答
  •  情歌与酒
    2021-02-01 10:27

    Based on Paul Irish's comment:

    function resizeBase64(base64, zoom) {
        return new Promise(function(resolve, reject) {
            var img = document.createElement("img");
    
            // once image loaded, resize it
            img.onload = function() {
                // get image size
                var imageWidth = img.width;
                var imageHeight = img.height;
    
                // create and draw image to our first offscreen canvas
                var canvas1 = document.createElement("canvas");
                canvas1.width = imageWidth;
                canvas1.height = imageHeight;
                var ctx1 = canvas1.getContext("2d");
                ctx1.drawImage(this, 0, 0, imageWidth, imageHeight);
    
                // get pixel data from first canvas
                var imgData = ctx1.getImageData(0, 0, imageWidth, imageHeight).data;
    
                // create second offscreen canvas at the zoomed size
                var canvas2 = document.createElement("canvas");
                canvas2.width = imageWidth * zoom;
                canvas2.height = imageHeight * zoom;
                var ctx2 = canvas2.getContext("2d");
    
                // draw the zoomed-up pixels to a the second canvas
                for (var x = 0; x < imageWidth; ++x) {
                    for (var y = 0; y < imageHeight; ++y) {
                        // find the starting index in the one-dimensional image data
                        var i = (y * imageWidth + x) * 4;
                        var r = imgData[i];
                        var g = imgData[i + 1];
                        var b = imgData[i + 2];
                        var a = imgData[i + 3];
                        ctx2.fillStyle = "rgba(" + r + "," + g + "," + b + "," + a / 255 + ")";
                        ctx2.fillRect(x * zoom, y * zoom, zoom, zoom);
                    }
                }
    
                // resolve promise with the zoomed base64 image data
                var dataURI = canvas2.toDataURL();
                resolve(dataURI);
            };
            img.onerror = function(error) {
                reject(error);
            };
            // set the img soruce
            img.src = base64;
        });
    }
    
    resizeBase64(src, 4).then(function(zoomedSrc) {
        console.log(zoomedSrc);
    });
    

    https://jsfiddle.net/djhyquon/69/

提交回复
热议问题