JSFiddle - React, Tailwind, and code Playground

by giperon

HTML

<body>
    <canvas id='canvas' width="180" height="351"></canvas>
</body>

JavaScript

var jpeg = document.createElement('img');
var alpha = document.createElement('img');

var canvas = document.getElementById('canvas');
var canvasWidth = canvas.offsetWidth;
var canvasHeight = canvas.offsetHeight;

var oc = document.createElement('canvas');
var ocontext = oc.getContext('2d');

var oc2 = document.createElement('canvas');
var ocontext2 = oc2.getContext('2d');

jpeg.onload = function () {
    alpha.onload = function () {

        canvas.width = canvasWidth;
        canvas.height = canvasHeight;
        var context = canvas.getContext('2d');
        context.clearRect(0, 0, canvas.width, canvas.height);

        var useAntialiasing = jpeg.height > canvas.height || jpeg.width > canvas.width;

        if (useAntialiasing) {
            //antialiasing
            oc.width = jpeg.width;
            oc.height = jpeg.height;
            ocontext.drawImage(alpha, 0, 0, oc.width, oc.height);
            ocontext.globalCompositeOperation = 'xor';
            ocontext.drawImage(jpeg, 0, 0, oc.width, oc.height);

            var scaleFunc = function (canvasSource, n) {
                oc2.width = Math.round(canvasSource.width / 2);
                oc2.height = Math.round(canvasSource.height / 2);
                ocontext2.drawImage(canvasSource, 0, 0, oc2.width, oc2.height);
                if (n - 1 == 0) return oc2;
                return scaleFunc(oc2, n - 1);
            };
            var scaleSmallFunc = function (canvasSource, n) {
                oc2.width = Math.round(canvasSource.width + (jpeg.width - canvasSource.width) / 2);
                oc2.height = Math.round(canvasSource.height + (jpeg.height - canvasSource.height) / 2);
                ocontext2.drawImage(canvasSource, 0, 0, oc2.width, oc2.height);
                if (n - 1 == 0) return oc2;
                return scaleFunc(oc2, n - 1);
            };
            var resultCanvas;
            if ((jpeg.height > 2 * canvas.height || jpeg.width > 2 * canvas.width)) {
                var steps =...